He tenido éxito en la construcción de varios de 32 bits, estática y Compartida, bibliotecas en Linux x86_x64 y ahora estoy tratando de vincular a un archivo ejecutable y me da el siguiente error:

/usr/bin/ld: foo.so: __moddi3: invalid version 21 (max 0)

foo.so: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

donde foo.así que es una de las bibliotecas compartidas de las que he construido.

el __moddi3 función es parte de la libgcc Entero Rutinas de la Biblioteca. Su firma es:

 Runtime Function: long __moddi3 (long a, long b)

Y su función es proporcionar a los 64 bits de la aritmética de 32 bits de código.

Ni siquiera puedo encontrar el significado de las versiones de esta biblioteca.

¿Por qué me aparece este error ahora – después de que la biblioteca ya era construir?

He construido todas las librerías compartidas con -fPIC y -m32 bandera para compilar y vincular.

El ejecutable es CXX ejecutable.

aquí está el enlace de salida con –verbose

Using built-in specs.
COLLECT_GCC=/usr/bin/c++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/--enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/32/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib32/:/lib/i386-linux-gnu/:/lib/../lib32/:/usr/lib/i386-linux-gnu/:/usr/lib/../lib32/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/i386-linux-gnu/:/lib/:/usr/lib/i386-linux-gnu/:/usr/lib/
COLLECT_GCC_OPTIONS='-g' '-m32' '-v' '-o' '../BIN/Y' '-L/home/X/W/Y/LibTee/lib/Linux' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=i686'
/usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccM5EczN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_i386 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib/ld-linux.so.2 -z relro -o ../BIN/Y /usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib32/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib32/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/32/crtbegin.o -L/home/X/W/Y/LibTee/lib/Linux -L/usr/lib/gcc/x86_64-linux-gnu/5/32 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib32 -L/lib/i386-linux-gnu -L/lib/../lib32 -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib32 -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../i386-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. -L/lib/i386-linux-gnu -L/usr/lib/i386-linux-gnu -rpath /home/X/W/Y/LibTee/lib/Linux:/home/X/W/Y/BIN -ltee ../openssl/Lib/Linux/libssl.a ../IPP_5_3_1_064/IA32/lib/Linux/libippcore.a ../IPP_5_3_1_064/IA32/lib/Linux/libippcp.a ../IPP_5_3_1_064/IA32/lib/Linux/libipps.a ../BIN/libCryptoDataGen.so -lgcc -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/5/32/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib32/crtn.o
/usr/bin/ld: ../BIN/libCryptoDataGen.so: __moddi3: invalid version 21 (max 0)
../BIN/libCryptoDataGen.so: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
InformationsquelleAutor Gil-Mor | 2017-01-24

1 Comentario

  1. 7

    Así, he encontrado la solución. El problema era:

    He construido una biblioteca compartida – foo.así. foo fue vinculada con algunos estática
    las bibliotecas. Me di cuenta de que muchas de ellas, se incluye la __moddi3 función
    junto con más libgcc cosas.

    Yo estaba tratando de vincular foo.así que para un ejecutable bar. bar también vinculado a las bibliotecas estáticas y muchos de ellos también se incluye la
    __moddi3 función junto con más libgcc cosas.

    El problema era que los foo.así símbolos exportados se tomó de las bibliotecas estáticas – el __moddi3 función fue uno de esos símbolos. Ver aquí una cubierta detallada de la situación. Así que al parecer lo que pasó es que el
    ejecutable tomó algunas libgcc cosas que no eran compatibles con el
    __moddi3 función de la versión que fue exportado por foo, a Continuación, cuando el enlazador se encontró con el __moddi3 versión – Se levantó un error acerca de
    yo tratando de enlace versiones incompatibles.

    La Solución es dado en el enlace anterior. La manera de lidiar con esto es el uso de una lista de exportación en los que se dice que el compilador de exportación quería símbolos y ocultar todos los otros símbolos (usando comodines *).

    Ya estoy usando CMake – he añadido -Wl,--version-script,exportmap a set_target_properties(foo PROPERTIES LINK_FLAGS. ‘exportmap’ es el nombre de mi lista de exportación de archivo. Es en el formato de:

        {  
    global:  
    func_1;  
    func_2;  
    func_3;  
    local:  
    *;  
    }

    Si no estás usando CMake agregar -Wl,--version-script,exportmap a C_FLAGS o CXX_FLAGS en el makefile.

    uso readelf -Ws foo.so para ver su exportación tabla de símbolos.

    He aquí otra buena lectura sobre el tema.

Dejar respuesta

Please enter your comment!
Please enter your name here