Определение того, является ли архив библиотеки для 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 стар как грязь и предшествует tar, который тоже существует уже некоторое время. - 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