В LINUX определить, является ли библиотека .a библиотекой 32-разрядной или 64-разрядной?

Мы распространяем в Linux статическую библиотеку как в 64-битной, так и в 32-разрядной версиях. При устранении неполадок с клиентом я бы хотел, чтобы моя диагностическая оболочка script быстро устранила проблему, проверив файл .a архива, чтобы определить, 32 или 64 бит. Методы, которые происходят со мной, менее элегантны:

  • извлечь член .o и запросить команду "файл" (например, 32-битный ELF и т.д.)

  • начать включать фиктивный элемент, закодированный для указания, например. 32bit.o/64bit.o и использовать "ar -t" для проверки

Я пробовал "строки xyz.a | grep 32", но это не очень хорошо работает над версиями. Не проблема с сердцем, но если вы знаете об элегантном решении, я хотел бы знать.

Ответ 1

objdump выглядит наилучшим образом:

objdump -f libfoo.a | grep ^architecture

Ответ 2

Самый простой способ - использовать команду file.

$file <.so file or .a file>

Ответ 3

Просто используйте команду file; т.е. file library.so

Ответ 4

Если есть функции, специфичные для конкретной версии, вы можете попробовать nm, затем grep для функции.

Ответ 5

oops, что отсутствующий sed означает, что он отображает многие элементы.

Как раз в ответ:

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

Как это должно работать:

  • nm - получить символы из библиотеки
  • grep - получить строки, начинающиеся с шестнадцатеричной строки (адрес символа в файле)
  • head - получить первую строку
  • sed - удалить все пробелы, включая пробелы
  • wc - подсчитать количество символов.

В 32-битной среде вы получаете адреса, состоящие из 8 шестнадцатеричных цифр, добавляя новую строку: 9. В 64-битной среде вы получаете адреса, состоящие из 16 шестнадцатеричных цифр, добавляя новую строку. 17.