Как правила выбора библиотеки различаются между золотом и стандартным (bfd) компоновщиком?

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

Я вижу случай, когда золото извлекает еще один файл *.so, чем ld.bfd (я использую опцию --as-required), и пытаюсь выяснить, почему и вообще какие другие различия Я должен следить за.

1 ответ

Решение

Правила выбора членов архивной библиотеки практически одинаковы для двух компоновщиков, но не имеют ничего общего с правилами определения, нужна ли общая библиотека.

Для архивных библиотек с индексом символа (т. Е. ranlib был выполнен), компоновщик рассматривает каждый символ в индексе по очереди. Если символ удовлетворяет неразрешенной ссылке в этой точке ссылки, компоновщик включает в себя элемент архива, который определяет символ. Он делает повторные проходы по индексу символа, пока не добавятся новые члены архива.

Правила становятся немного сложнее, когда дело доходит до слабых символов и общих символов, и золото и BFD ld немного различаются в обращении с общими символами (на данный момент - см. PR 23411).

Архивные библиотеки без символьного индекса в наши дни обычно не поддерживаются. Раньше считалось, что линкеры будут проходить через библиотеку один раз, добавляя элемент архива, если он удовлетворяет неразрешенной ссылке. Это требовало топологической сортировки библиотек (и во многих системах Unix для этого все еще есть инструмент "lorder").

Для разделяемых библиотек под --as-needed В качестве опции мы считаем библиотеку "необходимой", если она удовлетворяет неслабой ссылке из обычного объектного файла. Gold помечает общую библиотеку как "необходимую", даже если ссылка исходит от объекта, который следует за ней в порядке ссылок; Я думаю, что BFD ld помечает это как "необходимое", только если ссылка предшествует общей библиотеке.

Если вы пытаетесь выяснить, почему компоновщик считает, что определенная библиотека "нужна" или нет, вы можете найти компоновщик -y symbol вариант полезный.

Другие вопросы по тегам