2013-06-06 14 views
0

Учтите, что у меня есть общая библиотека 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? Было бы неплохо положиться на это, чтобы успокоить компоновщика. Я также заметил, что золотой линкер делает не сбой в этом случае. Каково намеренное поведение здесь?

+0

Хорошо, по историческим причинам, я отмечу, что я написал тест на это поведение. Кажется, он работает в Lucid, Precise и Raring. Вы можете получить копию теста здесь: https://github.com/acmorrow/solib-rpath-test. Надеюсь, это поможет кому-то в будущем. – acm

ответ

0

Основываясь на вышеупомянутом тесте, это, похоже, работает во всех последних версиях Ubuntu. Если вас интересует этот вопрос, и используйте мой тест и найдите платформу, на которой это поведение не работает, ответьте в комментариях.