2011-07-24 9 views
6

¿Hay alguna manera de cómo usar una antigua biblioteca estática de 32 bits * .a en un sistema de 64 bits. No es posible obtener un código fuente de esta biblioteca antigua para compilarlo de nuevo. Tampoco quiero usar -m32 en gcc, porque el programa usa muchas bibliotecas de 64 bits. Gracias.Usando la biblioteca de 32 bits en el programa C++ de 64 bits

+0

Puede enviar una pequeña máquina virtual de 32 bits con su código y despachar las llamadas a esa biblioteca ... –

+2

@Kerrek: No es necesaria una máquina virtual, solo IPC fuera de proceso. –

Respuesta

0

Respuesta simple: No puede.

+1

Esto es técnicamente _una respuesta_, pero un poco de elaboración sería agradable. –

6

Eso depende completamente de la plataforma en la que se está ejecutando. OS X en PowerPC, por ejemplo, que "solo funciona".

En plataformas x86, no puede vincular una biblioteca de 32 bits en un ejecutable de 64 bits. Si realmente necesita usar esa biblioteca, necesitará iniciar un proceso separado de 32 bits para manejar sus llamadas a la biblioteca, y usar alguna forma de IPC para pasar esas llamadas entre su aplicación de 64 bits y ese proceso de ayuda. Se prevenido: esto es mucha molestia. Asegúrese de que realmente necesite esa biblioteca antes de comenzar por esta carretera.

+1

Windows de 64 bits ejecuta bien el código de 32 bits, siempre que se encuentre en un proceso de modo de usuario de 32 bits. –

+0

@Ben Voigt: Tenía la impresión de que los ejecutaba en un emulador. No estoy familiarizado con WOW64 en detalle, por lo que no sé qué formas de IPC están disponibles para la comunicación entre un proceso de 64 bits y uno de 32 bits en Windows. –

+0

@Stephen: Think WINE (que no es un emulador). WOW64 es aproximadamente el mismo mecanismo, que proporciona un conjunto de bibliotecas de 32 bits que invocan las llamadas de sistema específicas del sistema operativo. –

0

Debe usar -m32 para cargar una biblioteca de 32 bits.

Probablemente su mejor enfoque es crear un servidor que envuelva la biblioteca. Luego, una aplicación de 64 bits puede usar IPC (varios métodos, por ejemplo, sockets, fifos) para comunicarse con el proceso que aloja la biblioteca.

En Windows esto se llamaría COM fuera de proceso. No sé si existe un marco similar en Unix, pero el mismo enfoque funcionará.

1

En la plataforma x86/x86_64, no puede hacer esto. Quiero decir, tal vez podrías si escribieras envoltorios personalizados de lenguaje ensamblador para cada función de 32 bits a la que quisieras llamar. Pero esa es la única forma en que es posible. E incluso si estuvieras dispuesto a hacer ese trabajo, no estoy seguro de que funcione.

La razón de esto es que las convenciones de llamada son completamente diferentes. La plataforma x864_64 tiene muchos más registros para jugar, y la ABI de 64 bits (interfaz binaria de aplicaciones, básicamente cómo se pasan los parámetros, cómo se configura un marco de pila y cosas así) estándares para todos los sistemas operativos hacen uso de estos registros adicionales para el paso de parámetros y similares.

Esto hace que los sistemas ABI de 32 bits y 64 bits x86/x86_64 sean completamente incompatibles. Tendría que escribir una capa de traducción. Y es posible que el ABI de 32 bits permita que el código de 32 bits juguetee con cosas de la CPU que el código de 64 bits no puede interferir, y eso haría que su trabajo sea aún más difícil ya que se le requerirá restaurar el posiblemente modificado estado antes de volver al código de 64 bits.

Y eso ni siquiera está hablando de este tema de los punteros. ¿Cómo se pasa un puntero a una estructura de datos que se encuentra en una dirección de 64 bits a un código de 32 bits?

Cuestiones relacionadas