Как я могу установить rpath исполняемого файла и проверить его значение после его сборки? - PullRequest
0 голосов
/ 27 февраля 2020

Я создаю следующий файл:

int main()
{
  return 0;
}

со следующими флагами:

g++ -o main -Wl,-rpath,'$ORIGIN' main.cpp

, но флаг rpath ничего не делает. Когда я выполняю следующие команды:

objdump -x main | grep -i rpath
readelf -a main | grep -i rpath

Я ничего не получаю (RPATH не определено).

Что я делаю неправильно?

EDIT

Я попытался выполнить вышеупомянутое с другим двоичным файлом, используя следующие флаги cmake:

set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "\$ORIGIN")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

Я переместил исполняемый файл на другую машину и поместил динамическую c библиотеку, которую он необходимо «dlopen» в той же папке. Это сработало (и я на 100% уверен, что это потому, что rpath, так как до применения вышеуказанных cmake флагов исполняемый файл не работал).

Тем не менее, используя две вышеуказанные команды для проверки rpath (objdump and readelf) Я до сих пор ничего не вижу.

1 Ответ

0 голосов
/ 27 февраля 2020

Если я не пропустил что-то здесь, вы не связываете никаких библиотек в вашей команде сборки.

Допустим, вы хотите связать разделяемую библиотеку libusb.so, , которая находится в подпапке libusb. вашей текущей папки, где находится основной. cpp. Я не буду здесь вдаваться в подробности о soname, имени ссылки lib et c, просто чтобы прояснить вопрос о rpath.

rpath предоставит путь компоновщика во время выполнения к библиотеке, а не для linktime, даже если потребуется общая библиотека присутствовать (быть доступным) во время компиляции / ссылки. Таким образом, чтобы обеспечить загрузчику приложения возможность поиска необходимой библиотеки во время запуска относительно папки вашего приложения, существует переменная $ ORIGIN, вы можете увидеть ее с помощью readelf, но только если вы связываете некоторую библиотеку с $ ORIGIN в rpath. Вот пример, основанный на вашем вопросе:

g++ main.cpp -o main -L./libusb -Wl,-rpath,'$ORIGIN/libusb' -lusb 

Как видите, вам нужно предоставить каталог -L для поиска по времени компиляции / компоновки и rpath для компоновщика во время выполнения. Теперь вы сможете проверить все необходимые библиотеки для вашего приложения, используя readelf и местоположение для поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...