La determinación de si un archivo de biblioteca de AIX es de 32-bit, 64-bit, o ambos, desde Linux

StackOverflow https://stackoverflow.com/questions/1705421

  •  19-09-2019
  •  | 
  •  

Pregunta

En AIX, me iba a correr:

ar -X32 -t libdb2.a

y comprobar la salida para determinar si hay un objeto de 32 bits en el archivo.Del mismo modo con -X64 para la comprobación de una de 64 bits objeto.Sin embargo, ¿qué pasa si estoy en otra plataforma, y la necesidad de revisar el archivo para ver lo que tiene?Por lo general estoy en Linux cuando tengo que consultar, pero igual podría ser en Solaris o HP-UX.

He utilizado para comprobar las shr.o y shr_64.o, ya que es lo que se está compilado, pero aquellos que están empezando a aparecer en los mensajes reales que se encuentran en el archivo, y por lo tanto la fiabilidad de estos han disminuido hasta el punto que me estoy poniendo de los falsos positivos.

Si alguien tiene un puntero, de preferencia algo que puedo hacer en perl, sería estupendo.

¿Fue útil?

Solución

No creo que hay una manera más fácil. Si crea dos archivos, uno de AIX de 32 bits y otro de 64 bits, de la siguiente manera:

$ cat a.c
int foo (void) { return 42; }
$ xlc -q32 a.c -c -o a32.o
$ xlc -q64 a.c -c -o a64.o
$ ar -X32 cr a32.a a32.o
$ ar -X64 cr a64.a a64.o

se termina con archivos que no están en un formato legible por el ar Linux:

$ file a32.a a64.a 
a32.a: archive (big format)
a64.a: archive (big format)
$ ar t a32.a
ar: a32.a: File format not recognized
$ ar t a64.a
ar: a64.a: File format not recognized

He intentado utilizar strings para ver si algo era obvio en los archivos, pero no encontré nada. Su opción que queda es inmejorable para construir un paquete binutils que apuntan a AIX (binutils de descarga, configurar con la opción --target=powerpc-ibm-aix5.3, ejecute make y listo: usted tiene una herramienta llamada powerpc-ibm-aix5.3-ar algún lugar de ese árbol de construcción).

Otros consejos

Me gustaría sugerir extracto de uno de los archivos .o del archivo .a, y después de ejecutar el comando de archivo en él. Ejemplo:

$ file fortune/fortune.o
fortune/fortune.o: ELF 32-bit MSB relocatable, SPARC, version 1 (SYSV), not stripped

file no es estándar en todos los sistemas, pero puede ser fácilmente compilado. Como alternativa, hay un par de módulos de Perl que hacen lo mismo que file .

ar ofrece el comando p que imprime el archivo en cuestión. Por ejemplo:

$ ar p libcurl.a base64.o > /tmp/base64.o
$ file /tmp/base64.o  
base64.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

Así que ... estoy un año de retraso, pero tenía el mismo problema. Aquí es cómo lo resolví, espero que ayude a alguien:

$ ar t mylib.a
myobj1.o
myobj2.o
myobj3.o

$ mkdir /tmp/mylib
$ cp mylib.a /tmp/mylib
$ cd /tmp/mylib
$ ls
mylib.a

$ ar x mylib.a
$ ls
mylib.a
myobj1.o
myobj2.o
myobj3.o

$ file *

posibles resultados:

mylib.a: current ar archive
myobj1.o: ELF 64-bit (...)
myobj2.o: ELF 64-bit (...)
myobj3.o: ELF 64-bit (...)

o

mylib.a: current ar archive
myobj1.o: ELF 32-bit (...)
myobj2.o: ELF 32-bit (...)
myobj3.o: ELF 32-bit (...)

Explicación: Un archivo de biblioteca de archivo es simplemente una colección de archivos ".o", cuando se utiliza el argumento de la 't' de AR que lista el contenido del archivo y cuando se utiliza el argumento de la 'x' de la AR se les extraiga. Escribir hombre ar para más instrucciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top