2013-05-02 6 views
0

Когда я перешел от использования GNU ld версии 2.20 до 2.21, я начал видеть следующее изменение в поведении. Не уверен, что это нарушение в 2.20, которое было исправлено в 2.21 или если что-то еще происходит.Изменение поведения gnu ld linker

libfoo.so : provides symbols foo() 
libfoobar.so : provides symbol bar() and specifies libfoo.so in its DT_NEEDED slot 
main.cpp : uses symbols foo() as well as bar() 

Раньше я мог бы построить main.cpp, просто делая:

g++ main.cpp -lfoobar 

Внутренняя зависимость foobar.so на foo.so будет гарантировать, что Foo(), а также бар() являются найдено

Теперь, выше не работает, и я должен явно связать Foo, а также:

g++ main.cpp -lfoobar -lfoo 

так что мой Вопрос: Какое правильное поведение. Если у .so есть зависимости, то они учитываются при поиске символов, используемых непосредственно в исполняемом файле, или эти зависимости доступны в частном пространстве имен только для .so?

Спасибо.

ответ

0

Так что мой вопрос: Что такое правильное поведение

Новое поведение является правильным.

Если .so имеет зависимости, то они учитываются при поиске символов, используемых непосредственно в исполняемом

No. Независимо от зависимостей libfoobar.so есть это частная деталь реализации, которые могут изменить завтра , Вы должны не рассчитывать на это. Если вы используете символы из libfoo.so, то вы должны указать -lfoo в командной строке.

Смежные вопросы