Recientemente, tuve problemas para intentar compilar una biblioteca de código abierto en mi Mac que dependía de otra biblioteca y obtuve algunos errores sobre las arquitecturas de bibliotecas incompatibles. ¿Alguien puede explicar el concepto detrás de la compilación de un programa C para una arquitectura específica? He visto el indicador del compilador -arch
anteriormente y he visto valores que se le han pasado, como ppc
, i386
y x86_64
, que asumo se asignan al "idioma" de la CPU, pero mi entendimiento se detiene allí. Si un programa utiliza una arquitectura particular, ¿todas las bibliotecas que carga deben estar en la misma arquitectura? ¿Cómo puedo saber en qué arquitectura se está ejecutando un programa/proceso determinado?Compilación de un programa C con una arquitectura específica
Respuesta
¿Alguien puede explicar el concepto detrás de la compilación de un programa C para una arquitectura específica?
Sí. La idea es traducir C a una secuencia de instrucciones nativas de la máquina, que tienen el programa codificado en forma binaria. El significado de "arquitectura" aquí es "arquitectura de conjunto de instrucciones", que es cómo se codifican las instrucciones en binario. Por ejemplo, cada arquitectura tiene su propia forma de codificación para una instrucción que agrega dos enteros.
El motivo para compilar las instrucciones de la máquina es que funcionan muy, muy rápido.
Si un programa utiliza una arquitectura particular, ¿todas las bibliotecas que carga deben estar en la misma arquitectura también?
Sí. (Existen excepciones pero son raras.)
¿Cómo puedo saber en qué arquitectura se está ejecutando un programa/proceso determinado?
Si un proceso se está ejecutando en su hardware, se está ejecutando en la arquitectura nativa que en Unix se puede descubrir mediante la ejecución del comando uname -m
, aunque para el lector humano la salida de uname -a
puede ser más informativo.
Si usted tiene un binario ejecutable o una biblioteca compartida (.so), se puede descubrir su arquitectura con el comando file
:
% file /lib/libm-2.10.2.so
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
% file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
Se puede ver que estos binarios se han compilado para los muy viejos Arquitectura 80386, a pesar de que mi hardware es un i686 más moderno. El i686 (Pentium Pro) es compatible con 80386 y ejecuta 80386 binarios, así como binarios nativos. Para hacer posible esta compatibilidad hacia atrás, Intel se enfrentó a un gran problema y costo —, pero prácticamente arrinconaron el mercado en CPUs de escritorio, ¡así que valió la pena!
Para construir una arquitectura diferente de la nativa de su CPU, necesitará un compilador cruzado, lo que significa que el código generado no puede ejecutarse de forma nativa en la máquina en la que está sentado. GCC puede hacer esto bien. Para saber en qué arquitectura está construido un programa para verificar el comando de archivo. En los sistemas basados en Linux, al menos, un programa x86 de 32 bits requerirá libs x86 de 32 bits. Supongo que es lo mismo para la mayoría de los sistemas operativos.
Una cosa que puede ser confusa aquí es que la plataforma Mac tiene lo que llaman universal binary, que en realidad son dos binarios en un archivo, uno para Intel y otro para la arquitectura ppc. Su computadora decidirá automáticamente cuál ejecutar. Puede (a veces) ejecutar un binario para otra arquitectura en un modo de emulación, y algunas arquitecturas son superconjuntos de otras (es decir, el código i386 generalmente se ejecutará en un i486, i586, i686, etc.) pero en su mayor parte el único código puede ejecutar es código para la arquitectura de su procesador.
Para la compilación cruzada, no solo el programa, sino todas las bibliotecas que utiliza, deben ser compatibles con el procesador de destino. A veces esto significa tener instalado un segundo compilador, a veces solo se trata de tener disponible el módulo adicional correcto para el compilador. El compilador cruzado para gcc is actually a seperate executable, though it can sometimes be accessed via a command line switch. Los compiladores cruzados de gcc para varias arquitecturas probablemente sean instalaciones separadas.
¿Ayuda ldd en este caso?
- 1. Compilación de un programa C++ con gcc
- 2. Compilación de vim con una versión específica de Python
- 3. Compilación de una biblioteca de impulso específica
- 4. Cómo obtener una compilación específica con la API de TFS
- 5. Compilación de varios archivos en un programa de C
- 6. C# CF: Cómo abrir una extensión de archivo específica con mi programa
- 7. generando un número aleatorio con una distribución específica en c
- 8. compilación del programa java
- 9. compilación gSoap con C++
- 10. ¿Cómo hacer que boost.build use una instalación de compilación específica?
- 11. C# plugin arquitectura pregunta
- 12. ¿Cómo escribir el programa durante la compilación?
- 13. ¿Cómo puedo establecer indicadores de compilación específicos para un objetivo específico en una configuración de compilación específica utilizando CMake?
- 14. Errores de compilación de Xcode iOS6: Sin arquitectura
- 15. ¿Hay una directiva simple Archivos de programa/Archivos de programa (x86) para C++ en Windows?
- 16. Arquitectura de complementos en C usando libdl
- 17. configuración de Xcode: Arquitectura vs arquitectura válida
- 18. Obtenga la salida de un programa C en una variable en otro programa C
- 19. ¿Cómo identificar qué líneas de código participaron en una ejecución específica de un programa Java?
- 20. Plugin de C# Arquitectura con interfaces compartidas entre complementos
- 21. MKMapItem con una ubicación específica
- 22. Interrelacionando un analizador Yacc/Bison con un programa C++
- 23. Iniciando un programa C++ oculto
- 24. Crear una aplicación SWT de arquitectura múltiple con Maven
- 25. ¿Puede un programa C manejar excepciones C++?
- 26. Ejecutar programa desde dentro de un programa C
- 27. ./configure con una versión específica de g ++
- 28. ¿Portar un kernel a una arquitectura diferente?
- 29. C ¿dónde definir un mutex en un programa de multiproceso?
- 30. Cómo depurar un programa C