Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: cvsdaveОтветов: 5

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

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

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

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

  • Я знаю о stackoverflow.com/questions/184502/ в поисках лучшего решения. cvsdave 14.04.2011
  • Решение в другом вопросе, кажется, решает проблему довольно аккуратно, но быстрый способ - это nm foo.a | grep '^0' | голова -1 | wc -c - если результат равен 17 (16+1 == 8 байт + 1 символ для возврата строки), это 64 бита, если это 9, это 32 бита (8+1 == 4 байта + 1 символ для возврата строки) Petesh 14.04.2011
  • А если я получу 14? о_0 Almo 28.04.2015

linuxarchive32bit-64bit

Ответы

Ответ 1 · рейтинг 125 · caf

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

objdump -f libfoo.a | grep ^architecture

Ответ 2 · рейтинг 36 · pankaj kapoor

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

$ file <.so file or .a file>

Ответ 3 · рейтинг 17 · Erik

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

Ответ 4 · рейтинг 3 · Petesh

к сожалению, отсутствие 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.

Ответ 5 · рейтинг 1 · ColWhi

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы