shared libraries - Cómo crear una biblioteca compartida de 32 bits en una plataforma de 64 bits con autotools
shared-libraries (7)
El indicador del enlazador GNU para construir un objeto compartido de 32 bits en una máquina de 64 bits es: -m elf_i386
Así que, por ejemplo, escriba en el Makefile:
LDFLAGS=-m elf_i386
Estoy usando autotools para construir mi sistema, que consiste principalmente en una biblioteca. En las plataformas Red Hat de 64 bits, debo poder producir una biblioteca capaz de trabajar en las plataformas Red Hat de 32 bits.
Cuando agrego -m32
a las líneas de compilación, todo funciona bien para producir una biblioteca estática ( .a
), pero tan pronto como intento crear una biblioteca compartida, aparece un error como este:
/usr/bin/ld: warning: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o'' is incompatible with i386 output
/usr/bin/ld: warning: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o'' is incompatible with i386 output
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o: In function `__do_global_dtors_aux'':
crtstuff.c:(.text+0x29): undefined reference to `__DTOR_END__''
collect2: ld returned 1 exit status''
Puedo ver que el problema es que incluye archivos de objeto de 64 bits de / usr / lib64 en lugar de los de 32 bits correctos de / usr / lib (están bien), pero no puedo entender cómo arreglarlo.
He tenido el mismo problema: al ejecutarme en una máquina Ubuntu de 64 bits, logré compilar y enlazar para hosts de 32 bits usando export CFLAGS=-m32; ./configure --host=i386
export CFLAGS=-m32; ./configure --host=i386
, pero libtool todavía generaría una biblioteca compartida de 64 bits.
Resolví esto creando un entorno de compilación de 32 bits y haciendo chroot en él. Ubuntu lo hace fácil a través de debootstrap .
He tenido este mismo problema. Pero yo no uso autotools. Luego, en el Makefile editado a mano, noté que en línea
$(CC) -shared -Wl,-soname,lib$(NAME).so.0 -o lib$(NAME).so.$(VERSION) $(OBJ)
no había ninguna opción para gcc que indique la arquitectura de 32 bits. Una vez que mi CFLAGS ya tiene la opción -m32, decidí ponerla en la línea mencionada anteriormente:
$(CC) $(CFLAGS) -shared -Wl,-soname,lib$(NAME).so.0 -o lib$(NAME).so.$(VERSION) $(OBJ)
y voilá. ¡Funciona!
Por lo tanto, en autotools, tal vez la configuración de la variable CFLAGS para incluir la opción -m32 también funciona para usted.
Espero haberte ayudado ...
Lo intentarías:
CFLAGS=-m32 -Wl,-m32
CXXFLAGS=-m32 -Wl,-m32
LDFLAGS=-m32
en su makefile, ya que algunos scripts intentan enlazar usando gcc o g ++ en lugar de ld como esperamos?
Actualización: En caso de que modifique manualmente cada llamada de gcc / g ++, intente usar -m32 -Wl, -m32 en lugar de simple -m32 como opción adicional.
Primero, asegúrese de tener soporte para compilador / libc para la compilación de 32 bits. En algunas distribuciones como Ubuntu, lo que debe hacer es instalar los paquetes gcc-multilib
y / o g++-multilib
:
sudo apt-get install gcc-multilib g++-multilib
Luego, al llamar a configure, especifique un host de 32 bits y pase banderas de compilación de 32 bits:
./configure --host=i686-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32"
Si no tiene instalado Multilib, obtendrá un error como configure: error: C compiler cannot create executables
al pasar el indicador -m32
.
Tuve este problema en RHEL6. Esto funciono
./configure --host=i386-redhat-linux --build=i386-redhat-linux "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" "LTCC=gcc -m32"
LTCC=gcc -m32
fue el encantamiento mágico necesario para que libtool construya la biblioteca de 32 bits
Una solución rápida ....
Cree la aplicación en una PC diferente con Linux de 32 bits y transfiera los archivos de la aplicación resultante (biblioteca, etc.) a la máquina de Linux de 64 bits deseada. A ver si funciona. Funciono para mi