Определяне дали библиотечен архив за AIX е 32-битов, 64-битов или и двете от Linux

На AIX бих стартирал:

ar -X32 -t libdb2.a

и проверете за изход, за да определите дали има 32-битов обект в архива. По същия начин с -X64 за проверка за 64-битов обект. Но какво да кажем, ако съм на друга платформа и трябва да проверя архива, за да видя какво има? Обикновено съм на Linux, когато трябва да проверя, но също толкова лесно бих могъл да съм на Solaris или HP-UX.

Преди проверявах за shr.o и shr_64.o, тъй като това е, което се компилира, но те започват да се показват в действителни съобщения, които са в архивите, и по този начин надеждността им спадна до точката, в която съм получаване на фалшиви положителни резултати.

Ако някой има указател, за предпочитане нещо, което мога да направя в perl, това би било страхотно.


aix
person Tanktalus    schedule 10.11.2009    source източник


Отговори (3)


Не мисля, че има лесен начин. Ако създадете два AIX архива, един 32-битов и един 64-битов, както следва:

$ 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

в крайна сметка получавате архиви, които не са в четим формат от linux ar:

$ 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

Опитах да използвам strings, за да видя дали има нещо очевидно в архивите, но не намерих нищо. Единствената ви оставаща опция е да изградите пакет binutils, насочен към AIX (изтеглете binutils, конфигурирайте с опция --target=powerpc-ibm-aix5.3, стартирайте make и готово: имате инструмент, наречен powerpc-ibm-aix5.3-ar някъде в това дърво на компилация).

person F'x    schedule 11.11.2009
comment
Не разбрах това име, но това е без значение. Новосъздаденият ar не хареса -X32, -X64 или -X32_64, почти ги игнорира. Но може би мога просто да погледна имената на файловете, които излизат, и да приема, че те следват нашите стандарти, така че, освен ако някой друг няма по-добра идея, това вероятно ще бъде дългосрочното решение, което ще приемем, ако успеем прекомпилирайте binutils и го поставете някъде публично след нашите адвокати. - person Tanktalus; 12.11.2009

Бих предложил да извлечете един от .o файловете от .a архива и след това да изпълните командата file върху него. Пример:

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

file не е стандартен за всяка система, но може лесно да се компилира. Като алтернатива има няколко perl модула, които правят същото като file .

ar предлага командата p, която отпечатва въпросния файл. Например:

$ 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
person brianegge    schedule 10.11.2009
comment
Добре, как да извлека .o файл от архива на Linux? ar не изглежда да желае да го направи. - person Tanktalus; 10.11.2009
comment
Не съм сигурен защо вашият ar не може да отпечата модул. Първо бих изброил модулите, за да се уверя, че съществува. ar е стар като мръсотия и предхожда катрана, който също съществува от известно време. - person brianegge; 05.11.2010

И така... закъснях с една година, но току-що имах абсолютно същия проблем. Ето как го реших, надявам се да помогне на някого:

$ 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 *

Възможни резултати:

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

OR

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

Обяснение: Архивният библиотечен файл е просто колекция от ".o" файлове, когато използвате аргумента "t" на ar, вие изброявате съдържанието на архива и когато използвате аргумента "x" на ar, вие ги извличате. Въведете man ar за допълнителни инструкции.

person ruasoliveira    schedule 25.11.2010