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

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

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

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

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


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


Ответы (5)


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

objdump -f libfoo.a | grep ^architecture
person caf    schedule 15.04.2011
comment
file легче читать, как указано ниже stackoverflow.com/a/8909086/233906 - person Cerber; 25.03.2013
comment
Я получаю architecture: i386:x86-64, flags 0x00000039:.. значит ли это, что и то, и другое..? это маловероятно. пожалуйста помогите :Д - person graywolf; 10.05.2016
comment
@Paladin: это 64-битная архитектура x86, описываемая objdump как i386 (обычная старая IA32), i386:x86-64 (AMD64) и i386:x64-32 (архитектура X32 с 32-битным адресным пространством в длинном режиме). - person caf; 11.05.2016
comment
@caf Большое спасибо :) - person graywolf; 11.05.2016
comment
Флаг '-f' в 'objdump' указывает отображать содержимое общего заголовка файла библиотеки 'libfoo.a'. Эти выходные данные из «objdump» затем передаются в команду grep, которая ищет слово «архитектура». Символ «^» означает, что строка должна начинаться с «архитектуры». - person Luke Purnell; 09.02.2018
comment
Очистите его и удалите дубликаты: objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u :) - person legends2k; 02.06.2018

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

$ file <.so file or .a file>
person pankaj kapoor    schedule 18.01.2012
comment
в среде msys это просто эхо ‹file›: текущий ar-архив, а не целевая архитектура. - person scones; 29.07.2013
comment
То же самое и в моей текущей среде Linux (Ubuntu). - person Asherah; 25.04.2014
comment
так же и в centos7 - person Chaim Geretz; 18.08.2016
comment
Он отлично работает на Ubuntu 16.04. (1) file armeabi/libpique.so --› libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped. (2) file x86/libpique.so --› libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped - person rpattabi; 09.12.2016
comment
Файл .so и файл .a — это не одно и то же. Показать, что это работает для разделяемой библиотеки, не то же самое, что показать, что это работает со статической библиотекой. Исходный вопрос касается статической библиотеки (файл .a). В моем случае (с использованием MSYS) решение objdump, опубликованное caf, работает, когда использование файла просто печатает «архив ar» так же, как и scones. - person Sean Burton; 22.02.2017

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

person Erik    schedule 25.04.2013
comment
Вопрос конкретно по статическим библиотекам. - person pooya13; 02.04.2020

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

person Petesh    schedule 14.04.2011
comment
Возможно, вы захотите добавить туда sed -e 's/ .*//' - person kowey; 04.11.2011
comment
У меня кстати 73. Хочешь объяснить, почему это должно работать? - person Francesco Dondi; 20.04.2017
comment
упс, этот отсутствующий sed был важен. Ответ обновлен с объяснением того, как он должен работать - person Petesh; 20.04.2017

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

person ColWhi    schedule 14.04.2011
comment
Возможно, вы сможете написать код, который ищет определенные байты в библиотеке. Вы можете попробовать использовать od для обоих файлов и найти различия между ними. - person ColWhi; 14.04.2011
comment
Другим решением было бы переименовать библиотеки. - person ColWhi; 15.04.2011