如何设置可执行文件的 rpath 并在构建后检查其值?

How can I set an executable's rpath and check its value after building it?

我正在构建以下文件:

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未定义)

我做错了什么?

编辑

我尝试使用以下 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)

我已将可执行文件移动到另一台机器,并将它需要的动态库放在同一文件夹中 'dlopen'。它起作用了(我 100% 确定这是因为 rpath,因为在应用上述 cmake 标志之前,可执行文件没有起作用)。

还是用上面两个命令查看rpath(objdump and readelf)还是没看到

如果我没有遗漏任何内容,那么您没有link在构建命令中使用任何库。

假设您想要 link libusb.so 共享库, 它位于当前文件夹的 libusb 子文件夹中 main.cpp. 我不会在这里做任何细节,关于 soname,linklib 的名称等,只是为了弄清楚 rpath。

rpath 将提供库的运行时 linker 路径,而不是 link 时间,因为即使是共享库也需要在 compile/link 时间内存在(可访问)。因此,为了让您的应用程序加载器有可能在启动时查找所需的库,相对于您的应用程序文件夹,有 $ORIGIN 变量,您可以使用 readelf 查看它,但前提是您 link 一些带有 $ORIGIN 的库在路径中。 这是基于您的问题的示例:

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

如您所见,您需要为 compile/link 时间搜索提供 -L 目录,为运行时 linker 提供 rpath。现在,您将能够使用 readelf 和搜索位置检查您的应用程序所需的所有库。