Как быстро найти объектные файлы, которые должны присутствовать в другом объектном тайле во время ссылки? - PullRequest
0 голосов
/ 22 февраля 2020

Я скомпилировал источники wget, вот сервер ftp https://ftp.gnu.org/gnu/wget/, чтобы связать мою собственную программу с одним из объектных файлов, которые я получил после компиляции проекта. Но выполнение nm -u для нужного файла (если быть точным c src/http.o) дает мне множество имен, которые необходимо разрешить во время компоновки.

Вопрос # 1

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

Вопрос № 2

Когда я пытаюсь связать свою программу со всеми возможными объектными файлами, полученными при компиляции проекта, я встречаю следующее ошибка - multiple definition. Означает ли это, что в общем случае мне нужно выбрать только значимое подмножество объектных файлов, которые я получаю после компиляции какого-то проекта, а затем собираю из них мой исполняемый файл?

1 Ответ

0 голосов
/ 23 февраля 2020

Существует ли инструмент для определения того, какие другие объектные файлы необходимы для компоновщика для разрешения всех символов?

Нет. Создание такого инструмента не составит труда (вы хотите найти связанные компоненты в графе зависимостей), но проблема не является общей.

Ручное тестирование каждой возможной комбинации объектных файлов даже не кажется разумным .

Похоже, wget состоит из примерно 100 исходных файлов. Используя все возможные перестановки, вам нужно будет только попробовать свою ссылку 100! раз, что на самом деле слишком много комбинаций, чтобы попробовать.

Как прокомментировал @kaylum, разработчики не собирались wget как это библиотека многократного использования, поэтому нет гарантии, что решение найдется, даже если вы попробуете каждую возможную комбинацию.

Также обратите внимание, что ссылка на источники wget накладывает лицензионные ограничения на вашу конечную программу (вам придется выпустить его под GPLv3).

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

То есть ожидается : и ваша собственная программа, и wget/src/main.c определяют функцию main.

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

Да. И в целом не гарантирует, что подмножество, удовлетворяющее вашим требованиям, даже существует.

...