Мы распространяем в Linux статическую библиотеку как в 64-битной, так и в 32-битной версии. При устранении неполадок клиента я хотел бы, чтобы мой сценарий диагностической оболочки быстро устранял проблему, проверяя файл архива .a, чтобы определить, является ли он 32-битным или 64-битным. Методы, которые приходят мне в голову, менее элегантны:
извлеките элемент .o и запросите команду "файл" (например, 32-разрядный ELF и т. д.)
начать включать фиктивный элемент, закодированный для указания, например. 32bit.o/64bit.o и используйте "ar -t" для проверки
Я пробовал "строки xyz.a | grep 32", но это не работает с версиями. Не душераздирающая проблема, но если вы знаете элегантное решение, я хотел бы знать.
Ответ 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 для этой функции.