Почему -L автоматически не включает -rpath при использовании разделяемой библиотеки?

Я не понимаю, почему необходимо указывать rpath или задавать переменную env, используя LD_LIBRARY_PATH, когда -L уже сообщает, где находится путь к общей библиотеке.

этот ответ говорит: -L говорит ld, где искать библиотеки, с которыми нужно ссылаться при компоновке.

Но почему в то же время соответствующий -rpath не устанавливается автоматически? почему мы должны сделать это снова вручную?

PS: я полагаю, если бы у вас была эта функция, то исполняемый файл был бы бесполезен в какой-то другой среде. Но если это так, то что на самом деле делает ld во время компоновки, или почему необходимо указывать -L путь, если -rpath в какой-то другой среде отличается.

1 ответ

Это определенно не "несоответствие компоновщика".

-L (гораздо более старый флаг) просто говорит компоновщику искать в этом каталоге любую библиотеку, которая соответствует любой последующей -l флаг, в том числе статические библиотеки / архивы (помните, во времена прошлого это была единственная библиотека). Он намеренно остается флагом только времени соединения; это не имеет никакого эффекта после завершения работы компоновщика.

-rpath это совершенно другой зверь. Его целью является включение в исполняемую или совместно используемую / динамическую библиотеку списка из одного или нескольких путей для поиска динамических библиотек, когда необходимые символы ищутся в общих библиотеках во время выполнения (r в -rpath).

Есть много случаев, когда хочется -L но нет -rpath; особенно когда кто-то хочет связать статическую библиотеку, а не отложить ее на динамический компоновщик. На большинстве платформ относительно просто переопределить встроенный rpathт. е. с LD_PRELOAD переменная окружения, и некоторые на самом деле считают это проблемой безопасности.

Возможно, посмотрите на http://sta.li/faq для убедительного аргумента против динамической связи.

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