48

Tenemos un problema relacionado con una aplicación Java que se ejecuta bajo un FC3 (bastante antiguo) en una tarjeta POS de Advantech con un procesador Via C3. La aplicación Java tiene varias librerías compiladas compiladas a las que se accede a través de JNI.Determine la arquitectura de destino del archivo binario en Linux (biblioteca o ejecutable)

Se supone que el procesador Via C3 es compatible con i686. Hace algún tiempo, después de instalar Ubuntu 6.10 en una placa MiniItx con el mismo procesador, descubrí que la declaración anterior no es 100% verdadera. El núcleo de Ubuntu se colgó al inicio debido a la falta de algunas instrucciones específicas y opcionales del i686 en el procesador C3. Estas instrucciones que faltan en la implementación C3 del conjunto i686 son utilizadas por defecto por el compilador GCC cuando se usan optimizaciones i686. La solución en este caso fue ir con una versión compilada i386 de la distribución de Ubuntu.

El problema de base con la aplicación Java es que la distribución FC3 se instaló en la HD al clonar desde una imagen de la HD de otra PC, esta vez una Intel P4. Posteriormente, la distribución necesitó algunos ataques para que se ejecutara, como la sustitución de algunos paquetes (como el kernel) por la versión compilada de i383.

El problema es que después de trabajar durante un tiempo, el sistema se cuelga completamente sin dejar rastro. Me temo que algún código i686 se deja en algún lugar del sistema y se puede ejecutar de forma aleatoria en cualquier momento (por ejemplo, después de recuperar desde el modo de suspensión o algo así).

Mi pregunta es:

  • ¿Hay alguna herramienta o forma de averiguar en qué arquitectura específica es un archivo binario (ejecutable o una biblioteca), destinado a condición de que "archivo" no da tanta información ?

Respuesta

13

Creo que necesita una herramienta que verifique cada instrucción, para determinar exactamente a qué conjunto pertenece. ¿Hay incluso un nombre oficial para el conjunto específico de instrucciones implementadas por el procesador C3? Si no, es aún más peludo.

Una variante quick'n'dirty podría ser hacer una búsqueda en bruto en el archivo, si puede determinar el patrón de bits de las instrucciones no permitidas. Simplemente haga una prueba para ellos directamente, podría hacerse por una simple cadena objdump | grep, por ejemplo.

+3

Objdump -d debe conseguirle una representación de ASM que luego puede grep para codigos de opcion malos. –

+0

Creo que seguiré de la manera que me propongas. Solo necesito averiguar cómo descompilar vmlinuz (no estoy seguro de si el kernel en sí es la versión i386 o i686). –

+0

+1. No es de mucha ayuda en mi caso, ¡pero realmente amo esta manera hacky! –

89

El comando 'file' de unix.linux es ideal para esto. En general, puede detectar la arquitectura de destino y el sistema operativo para un binario determinado (y se ha mantenido activo y desactivado desde 1973. wow!)

Por supuesto, si no se está ejecutando en Unix/Linux, usted es un poco atorado Actualmente estoy tratando de encontrar un puerto basado en Java al que pueda llamar en tiempo de ejecución ... pero no tuve tanta suerte.

El comando UNIX 'archivo' da información como esta:

hexagonal: ELF 32-bits LSB ejecutable, ARM, versión 1 (SYSV), vinculada de forma dinámica (utiliza bibliotecas compartidas), para GNU/Linux 2.4.17, no despojado

información más detallada acerca de los detalles de la arquitectura se insinuó con el comando 'objdump f' (Unix) que devuelve:

arquitectura: brazo, banderas 0x00000112: EXEC_P, HAS_SYMS, D_PAGED empezar 0x0000876c dirección

Este ejecutable fue compilado por un compilador cruzado gcc (compilado en una máquina i86 para el procesador ARM como un objetivo)

+2

llegué aquí de una búsqueda al azar de Google, y fue una gran ayuda, por ejemplo – aaronstacy

+4

La pregunta específicamente pide ir más allá de ** archivo ** pero vine aquí sobre la base del título, y ** archivo ** es exactamente lo que quería.Por lo tanto, es cuestionable si esta es realmente una buena respuesta, porque no respondía a la pregunta real, ¡pero sí respondía a la mía y aparentemente a Aaronstacy también! – patrickvacek

+2

(Agregué información sobre el comando 'objdump -f' de (unix) que va más allá del comando 'file'. Lamentablemente no sé qué significan los bits en las 'banderas' - probablemente necesite buscar el código de gcc para eso. (o úselos para comparar la configuración en varias máquinas de destino)) – Ribo

26

decido añadir una solución más para cualquier, que consiguió aquí: personalmente en mi caso, la información provi Dedicado por file y objdump no fue suficiente, y el grep no es de mucha ayuda. Resuelvo mi caso a través del readelf -a -W.

Tenga en cuenta que esto le da mucha información. La información relacionada con el arco reside desde el principio y hasta el final. He aquí un ejemplo:

ELF Header: 
    Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF32 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        EXEC (Executable file) 
    Machine:       ARM 
    Version:       0x1 
    Entry point address:    0x83f8 
    Start of program headers:   52 (bytes into file) 
    Start of section headers:   2388 (bytes into file) 
    Flags:        0x5000202, has entry point, Version5 EABI, soft-float ABI 
    Size of this header:    52 (bytes) 
    Size of program headers:   32 (bytes) 
    Number of program headers:   8 
    Size of section headers:   40 (bytes) 
    Number of section headers:   31 
    Section header string table index: 28 
... 
Displaying notes found at file offset 0x00000148 with length 0x00000020: 
    Owner     Data size Description 
    GNU     0x00000010 NT_GNU_ABI_TAG (ABI version tag) 
    OS: Linux, ABI: 2.6.16 
Attribute Section: aeabi 
File Attributes 
    Tag_CPU_name: "7-A" 
    Tag_CPU_arch: v7 
    Tag_CPU_arch_profile: Application 
    Tag_ARM_ISA_use: Yes 
    Tag_THUMB_ISA_use: Thumb-2 
    Tag_FP_arch: VFPv3 
    Tag_Advanced_SIMD_arch: NEONv1 
    Tag_ABI_PCS_wchar_t: 4 
    Tag_ABI_FP_rounding: Needed 
    Tag_ABI_FP_denormal: Needed 
    Tag_ABI_FP_exceptions: Needed 
    Tag_ABI_FP_number_model: IEEE 754 
    Tag_ABI_align_needed: 8-byte 
    Tag_ABI_align_preserved: 8-byte, except leaf SP 
    Tag_ABI_enum_size: int 
    Tag_ABI_HardFP_use: SP and DP 
    Tag_CPU_unaligned_access: v6 
+0

Descargo de responsabilidad: esto solo funciona si ya sabes que el archivo es un archivo ELF. Los binarios de Mach-O (que se ejecutan en iPhones y Macbooks) son un ejemplo de formato binario que no es ELF. – ryanrhee

+0

@ryanrhee, si aún no sabe si es ELF o no, entonces después de ejecutar el comando seguramente sabrá ☺ –

+1

Si solo desea la información de la arquitectura, puede usar 'readelf -A' –

4

Ampliando @ respuesta de Hi-Ángel He encontrado una manera fácil de comprobar el número de bits de una biblioteca estática:

readelf -a -W libsomefile.a | grep Class: | sort | uniq 

Dónde libsomefile.a es mi biblioteca estática. Debería funcionar también para otros archivos ELF.

5

Para responder a la ambigüedad de si un Via C3 es un procesador de clase i686: No lo es, es un procesador de clase i586.

Cyrix nunca produjo un verdadero procesador de clase 686, a pesar de sus reclamos de comercialización con las piezas 6x86MX y MII. Entre otras instrucciones faltantes, dos importantes que no tenían eran CMPXCHG8b y CPUID, que eran necesarias para ejecutar Windows XP y más allá.

National Semiconductor, AMD y VIA han producido diseños de CPU basados ​​en el núcleo Cyrix 5x86/6x86 (NxP MediaGX, AMD Geode, VIA C3/C7, VIA Corefusion, etc.) que han resultado en diseños extraños donde tiene un procesador de clase 586 con conjuntos de instrucciones SSE1/2/3.

Mi recomendación si se encuentra con cualquiera de las CPU enumeradas anteriormente y no es para un proyecto de computadora vintage (es decir, Windows 98SE y anteriores) luego corra gritando lejos de ella. Te quedarás atrapado en i386/486 Linux lento o tendrás que recompilar todo tu software con optimizaciones específicas de Cyrix.

1

cosa más rápida de encontrar la arquitectura sería la de ejecutar:

objdump -f testFile | grep architecture 

Esto funciona incluso para binario.

Cuestiones relacionadas