如何在Linux rpath中编码可执行文件位置?

Ted*_*ton 9 linux macos gcc rpath shared-libraries

我有一个可执行文件隐式加载几个.so库,所有这些都由我构建.对于部署,或至少测试/调试,我想将它们全部放在同一目录中:

my_executable
libmylib1.so
libmylib2.so
Run Code Online (Sandbox Code Playgroud)

为了让可执行文件隐式加载库,我想为可执行文件的目录设置一个rpath(DT_RUNPATH).使用OS X,我会这样做:

clang -dynamiclib -o libmylib1.dylib -install_name @rpath/libmylib1.dylib src1.c src2.c    
clang -dynamiclib -o libmylib2.dylib -install_name @rpath/libmylib2.dylib src3.c src4.c
clang -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath,@loader_path/. main.c
Run Code Online (Sandbox Code Playgroud)

请注意,@loader_path/.它在OS X中构成了可执行文件的rpath.对于Linux,我最接近的就是

gcc -dynamiclib -o libmylib1.so src1.c src2.c    
gcc -dynamiclib -o libmylib2.so src3.c src4.c
gcc -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath=. main.c
Run Code Online (Sandbox Code Playgroud)

这里的问题是在Linux上,rpath遵循当前的工作目录,而不是可执行文件的目录.有没有办法在Linux上完成同样的事情?

wic*_*ich 6

您需要使用文字字符串$ORIGIN作为运行路径,这被动态加载程序理解为可执行文件的位置.