由于 Linux 默认的查找路径中没有当前文件夹的,所以编译的程序或动态库移植比较麻烦。
查看依赖,rpath等信息
readelf -d path/to/exec
测试依赖库是否能找到
ldd path/to/exec
写rpath
patchelf --set-rpath "\$ORIGIN:\$ORIGIN/lib"
使用chrpath也能做到,但是无法修改没有rpath的文件,路径以冒号:
分割,$ORIGIN
表示当前的文件的路径,需要\$
做转义字符
值得注意的是,动态库的动态库依赖读取的rpath都是分别独立的。
shell脚本,批量修改当前文件夹下的 rpath
folder = "./"
allfiles = $(ls $folder | grep ".so$")
for sfile in ${allfiles}
do
patchelf --set-rpath "\$ORIGIN"${sfile}
done