Вопрос по linker, c++, c, static, unix – Получить список статических библиотек, используемых в исполняемом файле

39

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

Ваш Ответ

5   ответов
5

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

10

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

Нет ли способа разглядеть RAW ASM, или оптимизация компилятора и флаги также повлияют на это?
4

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

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

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

какие намеки вы имеете в виду? Можете привести примеры? Можете ли вы указать мне источник, где я могу найти больше этих подсказок?
Например, использование readelf покажет вам функции, объекты, символы, которые используются в двоичном файле. Они могут служить подсказками для поиска используемых библиотек. Например, вы можете увидеть там функцию Curl_http и знать, что libcurl наиболее вероятно используется двоичным файлом, и если он не динамически связан, он должен быть связан статически.
41

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

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

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

Вы сравниваете списки сcomm команда. Увидетьman comm для деталей.

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

Если это неизвестный двоичный файл, мы не знаем, какие библиотеки присутствуют. Итак, «запускаем nm против этих библиотек» звучит самоубийственно.
Как указывают @Goz и anon, это работает, только если двоичный файл не был удален / содержит отладочную информацию. Имена не нужны (и даже не используются) после того, как статическая библиотека была связана с приложением - все вызовы выполняются по адресу.
Это не отвечает на вопрос. "запуск nm против этих библиотек" невозможно, если вы не знаете библиотеки; и есть библиотеки, неявно используемые при компоновке.
7

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

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

Похожие вопросы