2009-12-22 7 views
15

Tengo una biblioteca .so binaria de 32 bits y tengo que generar el programa de 64 bits que la usa. ¿Hay alguna manera de ajustarlo o convertirlo, por lo que se puede usar con un programa de 64 bits?Vinculación de la biblioteca de 32 bits al programa de 64 bits

+0

Iba a sugerir recompilar el código de la biblioteca que apunta a 64 bits, pero da la impresión de que no tiene el origen ... Dudo que un código de 64 bits pueda 'pasar' a 32 bits ... puede hacerlo bajo gcc de linux? Pero, de nuevo, este 'thunking' era una característica de Win95 (¿Te acuerdas de eso?) Código de 32 bits que llama a código de 16 bits ... ¿has intentado vincular el código de 64 bits que hace referencia a la biblioteca dinámica de 32 bits (.so) y ejecutarlo? – t0mm13b

+0

No existe un equivalente "thunk" en ninguno de los sistemas operativos modernos de 64 bits. Esto no funcionará –

Respuesta

27

No. No se puede vincular directamente al código de 32 bits dentro de un programa de 64 bits.

La mejor opción es compilar un programa de 32 bits (independiente) que puede run on your 64bit platform (using ia32), y luego usar una forma de comunicación entre procesos para comunicarse desde su programa de 64 bits.

+1

@Reed: Entonces, ¿cómo manejó Win95 la transición desde el código de 32 bits llamando a 16bit a la 'thunking'? ¿Eso fue en el nivel de ensamblador para cambiar alrededor del puntero de la pila y los registros? – t0mm13b

+6

El sistema operativo manejó esto explícitamente, pero no hay nada que lo permita en Linux o en los sistemas operativos Windows modernos de 64 bits, por lo que debe usar una solución como la que publiqué. –

+0

@Reed: Gracias por responder mi pregunta. :) – t0mm13b

3

Es posible, pero no sin algunas magias serias entre bastidores y no le gustará la respuesta. Emule una CPU de 32 bits (no, no estoy bromeando) o cambie el proceso principal a 32 bits. Emular puede ser lento sin embargo.

This is a proof of concept de la técnica.

A continuación, guarde una tabla de cada acceso a memoria desde y hacia la biblioteca de 32 bits y manténgala sincronizada. Es muy difícil llegar a una integridad teórica, pero algo viable debería ser bastante fácil, pero muy tedioso.

En la mayoría de los casos, creo que dos procesos y luego el IPC entre los dos pueden ser más fáciles, como se sugiere de otra manera.

4

Para ver un ejemplo del uso de IPC para ejecutar complementos de 32 bits a partir del código de 64 bits, consulte el código abierto NSPluginWrapper.

Cuestiones relacionadas