Разница между относительным путем и использованием $ ORIGIN в качестве RPATH

#gcc

#gcc

Вопрос:

Рассмотрим две приведенные ниже команды для создания простого исполняемого файла

 $ gcc -g -Wall -Wl,--enable-new-dtags -Wl,-rpath,'$ORIGIN'/sharedLibDir -o prog main.c ./sharedLibDir/libdemo.so

$ gcc -g -Wall -Wl,--enable-new-dtags -Wl,-rpath,./sharedLibDir -o prog main.c ./sharedLibDir/libdemo.so
  

Очевидно, что один использует локальный каталог в качестве RPATH, другой использует $ORIGIN . Я не вижу, в чем разница между этими двумя (кроме значения RPATH и RUNPATH в двоичном файле); оба позволяют перемещать исполняемый файл и, при условии, что у него есть параллельный каталог с именем sharedLibDir, он запускается.

В чем смысл $ORIGIN? Есть ли у него какая-то дополнительная функциональность, которую я пропустил? Заранее спасибо.

Ответ №1:

При вашем использовании $ORIGIN поиск выполняется относительно каталога, содержащего исполняемый файл. Если вы указываете относительный каталог, он относится к текущему рабочему каталогу, что вряд ли когда-либо является тем, что вам нужно.

Комментарии:

1. Спасибо; Я не знал, что существует местоположение «install» как таковое — я скоро посмотрю это.

2. Местом установки является просто каталог, содержащий исполняемый файл. Извините, что смутил вас, я перефразирую свой ответ.

3. Итак, когда текущий рабочий каталог перестанет быть каталогом, содержащим исполняемый файл??

4. Ну, если вы откроете терминал и запустите ls , текущим рабочим каталогом будет /home/Wad , но каталог, содержащий ls исполняемый файл, является /bin .

5. Как насчет того, когда задействованы символические ссылки? Это все еще каталог исполняемого файла или каталог символической ссылки?