Определение, является ли библиотечный архив для AIX 32-разрядным, 64-разрядным или обоими из Linux - PullRequest
3 голосов
/ 10 ноября 2009

В AIX я бы запустил:

ar -X32 -t libdb2.a

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

Раньше я проверял shr.o и shr_64.o, так как это то, что компилируется, но они начинают появляться в реальных сообщениях, находящихся в архивах, и, следовательно, их надежность падает до такой степени, Я получаю ложные срабатывания.

Если у кого-то есть указатель, предпочтительно что-то, что я могу сделать в Perl, это было бы замечательно.

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

Я не думаю, что есть простой способ. Если вы создаете два архива 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 где-то в этом дереве сборки).

1 голос
/ 10 ноября 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
0 голосов
/ 25 ноября 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...