Сложность добавления $ ORIGIN в LDFLAGS - PullRequest
0 голосов
/ 27 мая 2020

Подобно этому сообщению , мне нужно передать $ORIGIN/../lib в мою процедуру компиляции. Я делаю это через

./configure "LDFLAGS=-Wl,-rpath,\$\$ORIGIN/../lib"
make

Однако, когда я проверяю исполняемый файл через objdump -x src/foo | grep PATH, я получаю

/home/Users/me/foo_repo/lib:/../lib

, когда мне нужно

/home/Users/me/foo_repo/lib:$ORIGIN/../lib

Итак, похоже, что $ORIGIN оценивается, а не просто помещается в RUNPATH

Как я могу предотвратить это? Я пробовал добавить экранирование к обоим $, но получил тот же результат.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Я пробовал это много раз, и кажется, что в какой-то момент он все еще может быть преобразован в пустую строку, поскольку Makefiles можно запускать рекурсивно. Единственный способ, который я нашел надежным, - это дополнительно определить export ORIGIN='$ORIGIN' в оболочке, где я запускаю configure и make, так что даже если оболочка расширяет $ORIGIN, это все равно приведет к значению $ORIGIN.

Обратите внимание, что вам также необходимо -Wl,-z,origin, чтобы значение $ORIGIN интерпретировалось во время выполнения.

0 голосов
/ 27 мая 2020

Это не работает, потому что вам нужен еще третий уровень цитирования: поскольку вы передаете это значение в сценарий configure через командную строку, вам нужно указать значение для оболочки.

Вы запускаете это:

./configure "LDFLAGS=-Wl,-rpath,\$\$ORIGIN/../lib"

Оболочка удаляет первый уровень цитирования перед вызовом configure, поэтому значение LDFLAGS, которое помещается в ваш make-файл, выглядит следующим образом:

LDFLAGS=-Wl,-rpath,$$ORIGIN/../lib

Затем, когда make запускает компоновщик, он преобразует экранированный $$ в одиночный $, а make вызовет оболочку и передаст вашу строку ссылки с опцией:

-Wl,-rpath,$ORIGIN/../lib

Shell расширит $ORIGIN, потому что он выглядит как переменная оболочки, разверните его до пустой строки, и вы получите результат -Wl,-rpath,/../lib.

Чтобы получить правильное цитирование, часто бывает полезно работать в обратном направлении. Когда make вызывает вашу строку ссылки, ему необходимо избежать $ORIGIN, чтобы оболочка не расширяла его, поэтому вы хотите, чтобы аргумент был примерно таким:

'-Wl,-rpath,$ORIGIN/../lib'

Чтобы получить это, вам нужно ваш LDFLAGS должен быть установлен примерно на:

LDFLAGS='-Wl,-rpath,$$ORIGIN/../lib'

Чтобы получить это, вам нужно убрать все это из оболочки при вызове configure, включая одинарные кавычки, что-то вроде:

./configure "LDFLAGS='-Wl,-rpath,\$\$ORIGIN/../lib'"

(заметьте, я не пробовал)

...