¿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
Respuesta
Respuesta simple: No puede.
Esto es técnicamente _una respuesta_, pero un poco de elaboración sería agradable. –
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.
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. –
@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. –
@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. –
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á.
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?
- 1. Vinculación de la biblioteca de 32 bits al programa de 64 bits
- 2. Windows 7 64 bits incorrecta PATH al cargar la biblioteca de 32 bits para 32 bits exe
- 3. 64 bits por división de 32 bits
- 4. Compilación de la aplicación matlab de 32 bits en la máquina de 64 bits (C++)
- 5. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 6. Ejecute AnyCPU como 32 bits en sistemas de 64 bits
- 7. conversión de aplicación .NET 32 bits a 64 bits
- 8. ¿Cómo compilar un programa C++ como de 64 bits en una máquina de 64 bits?
- 9. Registros de 64 bits en ventanas de 32 bits
- 10. Objeto compartido/bibliotecas mixtas de 32 bits y 64 bits
- 11. c: ¿usa punteros de 32 bits en la aplicación de 64 bits?
- 12. Cargar biblioteca de 32 bits DLL en la aplicación de 64 bits
- 13. Compilación de 32 bits con llvm-gcc de 64 bits
- 14. uso de 32 bits de servidor COM desde un programa de 64 bits .NET
- 15. Puerto 32 bits Controlador de Windows a 64 bits Windows
- 16. Determinación de Windows de 64 bits frente a 32 bits
- 17. Cargar biblioteca compartida de 32 bits desde la aplicación de 64 bits?
- 18. Utilice un instalador de NSIS para instalar binarios de 32 bits en sistemas operativos de 32 bits y binarios de 64 bits en sistemas operativos de 64 bits.
- 19. Agregar números de 64 bits con aritmética de 32 bits
- 20. División de 64/32 bits en un procesador con división de 32/16 bits
- 21. Java JDK 32 bits frente a 64 bits
- 22. uint es de 32 bits, sin importar si el sistema es de 32 o 64 bits?
- 23. Mezcla de 32 bits y 64 bits P/Invoca
- 24. MapViewOfFile compartido entre procesos de 32 bits y 64 bits
- 25. Compatibilidad con Java de 32 bits frente a 64 bits
- 26. ¿iPhone OS es de 64 bits o 32 bits?
- 27. Eclipse 32 bits ejecutándose en 64 bits JVM
- 28. Usando C#, ¿cómo saber si mi máquina es de 64 bits o 32 bits?
- 29. QtCreator en Linux: 32 bits frente a 64 bits
- 30. C# - inconsistente resultado de la operación matemática en 32 bits y de 64 bits
Puede enviar una pequeña máquina virtual de 32 bits con su código y despachar las llamadas a esa biblioteca ... –
@Kerrek: No es necesaria una máquina virtual, solo IPC fuera de proceso. –