Получить список статических библиотек, используемых в исполняемом файле - PullRequest
40 голосов
/ 14 июля 2009

Поскольку в ldd перечислены только динамические библиотеки, есть ли способ извлечь информацию о статических библиотеках, использованных для создания исполняемого файла?

Ответы [ 5 ]

42 голосов
/ 14 июля 2009

ldd <exe filename> показывает динамически связанные библиотеки

nm <exe filename> показывает символы в файле.

Чтобы увидеть, какие символы поступают из статических библиотек, необходимо запустить nm для этих библиотек, чтобы получить список символов (функций и т. Д.) В них, а затем сравнить их с тем, что в списке символов из nm <exe filename>.

Вы сравниваете списки с помощью команды comm. Подробнее см. man comm.

Это было взято с этого форума здесь .

11 голосов
/ 14 июля 2009

Нет, имена библиотек отбрасываются в процессе компоновки. Однако, если ваш исполняемый файл содержит отладочную информацию (т. Е. Он был скомпилирован с флагом -g), вы можете получить информацию из этого.

8 голосов
/ 11 марта 2015

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

Например, g++ -Xlinker -Map=a.map main.c, проверьте файл карты для связанной статической информации библиотеки.

5 голосов
/ 14 июля 2009

Если данный компилятор не хранит какие-либо метаданные внутри двоичного файла, то нет. Статическая библиотека - это код, который напрямую компилируется в двоичный файл.

4 голосов
/ 11 марта 2015

Невозможно получить список статических библиотек внутри некоторого ELF исполняемого файла.

Потому что для компоновщика статическая библиотека просто используется как «ленивый» набор членов. Таким образом, полученный исполняемый файл ELF будет содержать только элементы, необходимые для его связывания. Таким образом, такие элементы, как foo2.o из libfoo.a связаны, как если бы объектный файл foo2.o был связан с исполняемым файлом (при условии, что необходим некоторый символ, определенный в foo2, то есть где-то есть ссылка).

Конечно, использование nm, или objdump, или readelf, или strings в некоторых исполняемых файлах ELF может дать некоторые подсказки о том, какие объектные файлы (включая файлы из библиотек static ) ) находятся внутри него, потому что вы увидите символы, определенные в (членах) этих статических библиотек (или буквенные строки, используемые внутри них).

...