У LINUX визначте, чи є .a-бібліотека / архів 32-розрядним чи 64-розрядним?


87

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

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

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

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


Я знаю про stackoverflow.com/questions/184502/… , що шукає кращого рішення.
cvsdave

2
Рішення в іншому питанні, схоже, вирішує проблему досить акуратно, але швидкий спосіб - nm foo.a | grep '^ 0' | голова -1 | wc -c - якщо результат дорівнює 17 (16 + 1 == 8 байт + 1 символ для повернення рядка), це 64 біт, якщо 9 - це 32 біти (8 + 1 == 4 байти + 1 символ для повернення рядка)
Петеш

Що робити, якщо я отримаю 14? o_0
Алмо,

Відповіді:


123

objdump здається найкращим способом:

objdump -f libfoo.a | grep ^architecture

1
fileлегше читати, як зазначено нижче stackoverflow.com/a/8909086/233906
Cerber

1
Я розумію architecture: i386:x86-64, flags 0x00000039:.. це означає, що це обидва ..? це малоймовірно. будь ласка, допоможіть: D
greywolf

10
@Paladin: Це 64 біт - архітектури x86 описуються objdump як i386(звичайний старий IA32), i386:x86-64(AMD64) та i386:x64-32( архітектура 32-бітний адрес-простір X32 в довгому режимі).
кафе

1
Прапор '-f' у 'objdump' вказує на відображення вмісту загального заголовка файлу бібліотеки 'libfoo.a'. Потім цей результат з 'objdump' передається в команду grep, яка шукає слово 'архітектура'. Символ "^" означає, що "архітектура" повинна починати рядок.
Luke Purnell,

3
Очистіть це і видаліть дурні: objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u:)
legends2k

33

Найпростіший спосіб - скористатися командою file.

$file <.so file or .a file>

31
в середовищі msys це просто відлуння <файл>: поточний архів ar , а не цільова архітектура.
scones

11
Так само в моєму поточному середовищі Linux (Ubuntu).
Ашера

4
так само в centos7
Хаїм Герец

Він чудово працює на 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
rpattabi

5
Файл .so та .a - це не одне і те ж. Показати, що це працює для спільної бібліотеки - це не те саме, що показати, що вона працює зі статичною бібліотекою. Початкове питання стосується статичної бібліотеки (.a-файлу). У моєму випадку (з використанням MSYS) рішення objdump, опубліковане кафе, працює, коли використання файлу просто друкує "ar archive" так само, як отримує scones.
Шон Бертон,

17

Просто використовуйте команду file; тобтоfile library.so


Питання стосується саме статичних бібліотек.
pooya13

3

На жаль, це відсутнє 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 - отримати рядки, що починаються з шістнадцяткового рядка (адреса символу у файлі)
  • голова - отримати перший рядок
  • sed - видалити все, що залишилось за пробілами, включаючи пробіли
  • wc - підрахувати кількість символів.

У 32-розрядному середовищі ви отримуєте адреси, що складаються з 8 шістнадцяткових цифр, додавання нового рядка дає вам 9: У 64-бітному середовищі ви отримуєте адреси, що складаються з 16 шістнадцяткових цифр, додавання нового рядка дає вам 17.


1
Можливо, захочеться закинути туди sed -e 's /. * //'
kowey

Я до речі отримую 73. Потрібно пояснити, чому це має працювати?
Франческо Донді

ой, важлива ця відсутність седа. Відповідь оновлена, з поясненням того, як це має працювати
Петеш,

1

Якщо є функції, специфічні для певної версії, ви можете спробувати nm, тоді grep для функції.


Можливо, ви зможете написати якийсь код, який шукає певні байти в бібліотеці. Ви можете спробувати використовувати od для обох файлів і знайти відмінності між ними.
ColWhi

1
Іншим рішенням було б перейменувати бібліотеки.
ColWhi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.