2010-10-29 6 views
10

En el host de 64 bits estoy intentando construir bibliotecas compartidas con la opción -m32. ¿Es posible que estas bibliotecas estén vinculadas a bibliotecas regulares de 64 bits?GCC -m32 bandera:/usr/bin/ld: omisión incompatible

que estoy haciendo algo como esto:

g++ -m32 -shared source.cpp -l 64_bit_library.so -o 32_bit_library.so 

y recibiendo mensajes de error como este:

/usr/bin/ld: skipping incompatible 64_bit_library.so 

Así que mi pregunta es: ¿cómo 64_bit_library.so y 32_bit_library.so debe ser compilado en el host de 64 bits, a Permitir que 32_bit_library.so se vincule con 64_bit_library.so?

Respuesta

11

No es posible vincular aplicaciones de 32 bits con bibliotecas de 64 bits y viceversa. El problema es que los punteros y tipos en general no se pueden pasar entre ellos. Normalmente, la solución consiste en engendrar un proceso secundario del otro tamaño y usar IPC para comunicarse con ese proceso.

pensar de esta manera: Si tengo una función de C trivial:

extern void foo(void*); 

Si está en una biblioteca de 64 bits e intento y lo llaman de una biblioteca de 32 bits de dónde viene la otra mitad del puntero llegado ¿de?

Por el contrario, si está en una biblioteca de 32 bits y lo llamo desde una aplicación de 64 bits, ¿qué le sucede a la otra mitad del puntero que tendría que perder para llamarlo?

+0

Si fue muy cuidadoso, es posible que pueda jugar algunos juegos con typedef, mmap con el indicador MAP_32BIT y segmentos de memoria compartida, pero es una gran cantidad de problemas. – Flexo

+0

¿Puedes decir de todos modos cómo comprobar que no es compatible? usando readelf tal vez? - http://rzr.online.fr/q/gcc – RzR

+0

@rzr - La forma más fácil de verificar sería simplemente usar el comando 'file' en el objeto compartido y ver si coincide con lo que está intentando para hacer con gcc. Puede resolverlo con 'readelf -h' o' objdump -x' por ejemplo, pero creo que el resultado de 'file' es más conciso. – Flexo

Cuestiones relacionadas