В LINUX определите, есть ли .a библиотека / архив 32-битная или 64-битная? - PullRequest
74 голосов
/ 14 апреля 2011

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

  1. извлекают член .o и задают команду "file" (например, 32-битный ELF и т. Д.)

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

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

Ответы [ 5 ]

107 голосов
/ 15 апреля 2011

objdump кажется лучшим способом:

objdump -f libfoo.a | grep ^architecture
26 голосов
/ 18 января 2012

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

$file <.so file or .a file>
16 голосов
/ 25 апреля 2013

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

2 голосов
/ 14 апреля 2011

упс, этот отсутствующий 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'

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

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

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

1 голос
/ 14 апреля 2011

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

...