修改rpath解决linux(ubuntu)运行'cannot open shared object file'
之前的修改方式是存在缺陷的,工作目录只能在bin目录下,如果使用./bin/protoc依然会出问题。改进方式:
patchelf --set-rpath '$ORIGIN/../lib' protocpatchelf --set-rpath '$ORIGIN/../lib' libprotoc.so.32
参考链链接:
https://github.com/ziglang/zig/issues/5827
关于$ORIGIN,可以查看手册 man ld-linux
<hr>
-------------------------------------------- 分割线,以下为旧的 ----------------------------------------
背景
通过下载源代码编译protobuf,没有使用install命令安装到系统目录中,目录结构如下:
目录结构
此时如果在bin目录执行./protoc是会出错的:
直接运行
总结(放在前面):
chrpath -r ../lib protocpatchelf --set-rpath ../lib/ libprotoc.so.32
上面使用了两种方式,此处两种方式是等效的,可以两次都是chrpath或者都使用patchelf,两个工具都可以修改目标的rpath
注意点:
在修改libprotoc.so.32的rpath时,相对目录的主体应该是protoc。次例子中libprotoc.so.32依赖了libprotobuf.so.32,并且它两都在lib目录中,但设置的rpath一样是相对protoc的目录,即../lib。
过程
1. 查看依赖 ldd ./protoc
依赖
2. 修改protoc的rpath:chrpath -r ../lib protoc
image.png
3. 查看以下修改后的rpath: readelf -d protoc
image.png
4. 修改libprotoc.so.32的rpath: patchelf --set-rpath ../lib/ libprotoc.so.32
5. 查看依赖: ldd protoc,此时已经没有not found了
image.png
其他方法
可以在编译的时候设置rpath。个人喜好如果是我自己的东西我会这样作,别人的东西就不去修改编译过程了
参考链接
https://blog.csdn.net/sinat_35178307/article/details/109164966
页:
[1]