Можно ли статически связать общий объект? - PullRequest
6 голосов
/ 19 апреля 2011

Мой вопрос не совпадает с этот вопрос .

Я работаю над проектом с автономным двоичным файлом, который не имеет динамической / внешней связи и работает в среде * nix.

Я пытаюсь перейти на более новый набор инструментов для сборки, но некоторые из статических библиотек, которые доступны со старым набором инструментов, сейчас недоступны - например, библиотеки crt, которые предоставили _start не предоставляются в этом наборе инструментов.

Я копался в файлах, поставляемых с набором инструментов поставщика, и нашел некоторые общие объекты с символами, которые мне нужны, из библиотек crt (например, _start, _fini и т. Д.), Но я не уверен существует ли простой способ статически связать общий объект в двоичный файл и, кроме того, иметь возможность выполнения этого двоичного файла.

Краткая версия: Может ли двоичный файл не общего объекта быть статически связан с общим объектом, чтобы результат не стал другим общим объектом?

Ответы [ 2 ]

8 голосов
/ 02 августа 2011

Существует принципиальная разница между разделяемой библиотекой и статической библиотекой.Прежде всего, поищите на этом сайте предыдущие обсуждения, и проверьте этот вопрос также (и ответы на нем).

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

3 голосов
/ 11 декабря 2017

Да, я знаю, что это 6-летний вопрос.Мне сказали, что можно статически связываться с библиотекой общего объекта, но я также обнаружил, что это не так.

Фактически продемонстрировать, что статическое связывание библиотеки разделяемых объектов невозможно с ld (компоновщик gcc), используйте следующую команду gcc:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(Конечно, вам придется скомпилировать objectname.o из sourcename.c, и выВероятно, вам следует также создать собственную библиотеку разделяемых объектов. Если вы это сделаете, используйте -Wl,--library-path,., чтобы ld мог найти вашу библиотеку в локальном каталоге.)

Фактическая ошибка, которую вы получаете:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

Очевидно, что попытка вытащить объект из библиотеки разделяемых объектов - это то, о чем ld будет препятствовать.

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

Надеюсь, это поможет.

...