Как определить, скомпилирована ли общая библиотека как 32-битная или 64-битная

libquery=/lib32/libgcc_s.so.1; if [ `nm -D $libquery | sed -n '/[0-9A-Fa-f]\{8,\}/ {p; q;}' | grep "[0-9A-Fa-f]\{16\}" | wc -l` == 1 ]; then echo "$libquery is a 64 bit library"; else echo "$libquery is a 32 bit library"; fi;


Эта команда определяет, является ли указанная общая библиотека (shared library) 32-битной или 64-битной. Она выполняет следующие шаги:

1. libquery=/lib32/libgcc_s.so.1; — Задает переменную libquery, указывая путь к общей библиотеке.

2. if [ nm -D $libquery | sed -n ‘/[0-9A-Fa-f]\{8,\}/ {p; q;}’ | grep «[0-9A-Fa-f]\{16\}» | wc -l == 1 ]; — Это условие проверяет результат выполнения следующей последовательности команд:

nm -D $libquery — Эта команда извлекает информацию о символах из общей библиотеки.
sed -n '/[0-9A-Fa-f]\{8,\}/ {p; q;}' — С помощью sed выбираются строки, содержащие хексадецимальные числа, представляющие адреса символов.
grep "[0-9A-Fa-f]\{16\}" — Фильтрует строки, содержащие 16-значные хексадецимальные числа (предполагается, что это адреса 64-битных символов).
wc -l — Подсчитывает количество найденных строк.

3. then echo "$libquery is a 64 bit library"; — Если условие истинно (то есть найден ровно один 16-значный хексадецимальный адрес), выводит сообщение, указывающее, что библиотека является 64-битной.

4. else echo "$libquery is a 32 bit library"; — Если условие ложно (ноль или более одного 16-значного адреса), выводит сообщение, указывающее, что библиотека является 32-битной.

Альтернативы: Можно использовать утилиту file для определения архитектуры библиотеки, что может быть более простым способом.

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *