Каковы рекомендуемые параметры компоновщика GNU для указания $ORIGIN в RPATH?

Предположим, моя платформа — это ванильный (не встроенный) x86-64 Linux с использованием набора инструментов сборки GNU (GCC и т. д.).

Чтобы указать $ORIGIN в RPATH, я знаю об опции компоновщика: -Wl,-rpath,'\$\$ORIGIN'.

Сегодня обнаружил еще один вариант: -Wl,-z,origin.

Должен ли я всегда включать -Wl,-z,origin при использовании -Wl,-rpath,'\$\$ORIGIN'?

Официальная документация GNU ld, например:

Отмечает, что объект может содержать $ORIGIN.

Связанные, но разные: https://stackoverflow.com/questions/33853271/what-are-the-recommended-gnu-linker-options-to-specify-rpath


person kevinarpe    schedule 22.11.2015    source источник
comment
Одним из распространенных приемов, позволяющих избежать искажения этого флага оболочкой, является установка ORIGIN='$ORIGIN'. Конечно, он по-прежнему должен быть защищен от make и любого генератора make-файлов, который вы используете.   -  person Marc Glisse    schedule 23.11.2015


Ответы (1)


Я знаю об опции компоновщика: -Wl,-rpath,'\$\$ORIGIN'

Вы ошибаетесь: вышеприведенная опция не будет делать то, что вы хотите. Вам нужен вариант -Wl,-rpath='$ORIGIN'. Разница:

echo "int main() { }" | gcc -xc - -Wl,-rpath,'\$\$ORIGIN' &&
readelf -d a.out | grep ORIGIN

 0x000000000000000f (RPATH)              Library rpath: [\$\$ORIGIN]

echo "int main() { }" | gcc -xc - -Wl,-rpath='$ORIGIN' &&
readelf -d a.out | grep ORIGIN

 0x000000000000000f (RPATH)              Library rpath: [$ORIGIN]

Должен ли я всегда включать -Wl,-z,origin

-Wl,-z,origin устанавливает DF_ORIGIN в динамической записи FLAGS_1.

Что касается текущей магистрали GLIBC, ничего не смотрит на значение этого флага, поэтому, если вы нацеливаете GLIBC (большинство программ для Linux), ответ таков: не имеет ни малейшего значения, используете ли вы -z origin или нет.

Ответ может быть другим для других реализаций libc. Тем не менее, Solaris libc (откуда берется весь $ORIGIN), похоже, также не требует установки DF_ORIGIN, поэтому, вероятно, будет безопаснее полностью игнорировать это.

person Employed Russian    schedule 23.11.2015
comment
Отлично. Спасибо за исправление моего (неправильного) понимания правильного цитирования $ORIGIN. Кроме того, я не знал о трюке gcc - для компиляции тривиальных программ в командной строке. - person kevinarpe; 23.11.2015
comment
Знаете ли вы также ответ на stackoverflow.com/questions/33853271/? - person kevinarpe; 23.11.2015
comment
Кажется, что по крайней мере некоторые старые производные BSD (например, DragonFly v5.6.2) будут игнорировать разрешение $ORIGIN, если опция -z origin отсутствует при компоновке. К сожалению, некоторые линкеры, например. от mingw будет ошибка с unrecognized option '-z'. - person Marcel Greter; 05.05.2020