Извлечение статически связанных библиотек из исполняемого файла - PullRequest
8 голосов
/ 13 ноября 2009

Я не уверен, что это вообще возможно, но, учитывая исполняемый файл (foo.exe), имеет много библиотек, которые были связаны статически.

Существует ли какое-либо программное обеспечение, извлекающее из этого файла файл .lib (или .a), находящийся внутри исполняемого файла?

Спасибо.

Ответы [ 3 ]

15 голосов
/ 13 ноября 2009

Невероятно маловероятно, поскольку, как правило, вы не получаете все содержимое библиотеки, внедренное в ваш исполняемый файл.

Вы получаете достаточно, чтобы удовлетворить все неопределенные символы. На самом деле это может быть только небольшая часть библиотеки. Библиотека обычно состоит из набора объектных файлов, из которых только те, которые требуются, связаны с вашим исполняемым файлом.

Например, если бы единственная вещь, которую вы вызывали в библиотеке времени выполнения C, была exit(), вы вряд ли бы имели семейство функций printf() в вашем исполняемом файле.

Если вы связались с объектными файлами напрямую, у вас может быть шанс, поскольку они будут включены, используются ли они или нет (если ваш компоновщик не является умным).

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

Позвольте мне уточнить типичный процесс:

  1. Четыре объектных файла, a.o, b.o, c.o и d.o содержат функции a(), b(), c() и d() соответственно. Они все добавлены в архив abcd.a.
  2. Все они автономны (без зависимостей), за исключением того факта, что b() вызывает c().
  3. У вас есть основная программа, которая вызывает a() и b(), и вы компилируете ее, а затем связываете ее с библиотекой abcd.a.
  4. Компоновщик перетаскивает a.o и b.o из библиотеки в ваш исполняемый файл, удовлетворяя потребность в a() и b(), но вводя потребность в c(), потому что b() это нужно.
  5. Затем компоновщик перетаскивает c.o из библиотеки в ваш исполняемый файл, удовлетворяя потребность в c(). Теперь все неопределенные символы удовлетворены, исполняемый файл готов и очищен, вы можете запустить его, когда будете готовы.

Ни на одном из этапов этого процесса d.o не было перетащено в ваш исполняемый файл, поэтому у вас нет надежды получить его.

Обновление: Re "если есть другой способ, я бы посмотрел на этот первый" комментарий, который я сделал выше, вы только что заявили в комментарии к одному из другие ответы, что у вас есть исходный код, который сделал библиотеки, которые вы хотите извлечь. Мне нужно спросить: почему вы не можете перестроить библиотеки с этим источником? Это кажется мне гораздо более простым решением, чем попытка воссоздать библиотеки из болота исполняемого кода.

1 голос
/ 13 ноября 2009

Представьте себе, что у вас 10 книг на непонятном вам языке, без обложек, титульных страниц, номеров страниц и глав. Некоторые из книг могут быть неполными. Все страницы перемешаны вместе, поэтому невозможно определить, где находится начало и конец каждой книги. (Каждая страница является вызовом функции) Теперь попробуйте найти страницу 123 книги 5 (скажем, упомянутая выше функция Exit (). ).

Ну, это возможно ...

0 голосов
/ 13 ноября 2009

Кажется, вы просите декомпилятор. Такие инструменты сложны в использовании (вероятно, невозможны для слегка сложного C ++), и если есть какой-либо другой способ решения вашей проблемы, включая переписывание библиотек в течение нескольких месяцев, я бы порекомендовал такой способ действий.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...