Учтите, что у меня есть общая библиотека ELF liba.so
, которая экспортирует символ from_a
. Реализация from_a
определена в терминах символа from_b
, который экспортируется из общей библиотеки libb.so
, а liba.so
имеет запись DT_NEEDED для libb.so
.Какие гарантии, если таковые имеются, даны с помощью лифтера ELF для определения косвенных зависимостей?
У меня теперь есть program
, в котором используется символ from_a
. Когда я связываю program
, я включаю -la
в линию связи, а также любой путь поиска по ссылке, если таковой имеется, необходим для компоновщика, чтобы найти liba.so
. Прямых зависимостей от символов от libb.so
нет в program
.
Первый вопрос: гарантируется, что (в смысле портативного ко всей ненарушенной ELF с использованием системы), что мне не нужно перечислять косвенные зависимости (в данном случае libb.so
) из liba.so
на линии связи для program
? Я считаю, что это правда, но я хотел бы подтвердить. Является ли это поведение компоновщика обязательным по любой спецификации? Если да, то какой из них (ELF spec?)
Второй вопрос: Если liba.so
и libb.so
установлены в нестандартном месте (например, $ HOME/lib, в отличие от/usr/lib), который не используется по умолчанию , то при связывании program
, линкер BFD, по крайней мере, на моей текущей системе и несколько других, которые я тестировал, будет жаловаться на то, что libb.so
не может быть найден, несмотря на то, что каталог установки библиотеки указан с -L и предлагает использовать -rpath
или -rpath-link
. Однако, если RPATH или RUNPATH, определяющие местоположение установки, установлены в liba.so
, тогда компоновщик BFD будет размещен. Почему линкер BFD заботится о том, можно ли найти libb.so
во время соединения, если program
не имеет прямой зависимости от него? Получено ли поведение, полученное установкой RPATH на liba.so
? Было бы неплохо положиться на это, чтобы успокоить компоновщика. Я также заметил, что золотой линкер делает не сбой в этом случае. Каково намеренное поведение здесь?
Хорошо, по историческим причинам, я отмечу, что я написал тест на это поведение. Кажется, он работает в Lucid, Precise и Raring. Вы можете получить копию теста здесь: https://github.com/acmorrow/solib-rpath-test. Надеюсь, это поможет кому-то в будущем. – acm