Почему -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 для убедительного аргумента против динамической связи.