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

时间:2012-09-13 03:33:04

标签: linux macos gcc shared-libraries rpath

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

my_executable
libmylib1.so
libmylib2.so

为了让可执行文件隐式加载库,我想为可执行文件的目录设置一个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

注意在OS X中形成可执行文件的路径的@loader_path/.。对于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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

一个常见的解决方案是创建一个shell脚本包装器,它可以确定可执行文件所在的目录,并在执行实际可执行文件之前适当地设置LD_LIBRARY_PATH。