如何设置可执行文件的 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 和搜索位置检查您的应用程序所需的所有库。
我正在构建以下文件:
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 和搜索位置检查您的应用程序所需的所有库。