修改rpath解决linux(ubuntu)运行’cannot open shared object file’

内容分享1小时前发布
0 0 0

之前的修改方式是存在缺陷的,工作目录只能在bin目录下,如果使用./bin/protoc依然会出问题。
改善方式:

patchelf --set-rpath  $ORIGIN/../lib  protoc
patchelf --set-rpath  $ORIGIN/../lib  libprotoc.so.32

参考链链接:
https://github.com/ziglang/zig/issues/5827

关于$ORIGIN,可以查看手册 man ld-linux


——————————————– 分割线,以下为旧的 —————————————-

背景

通过下载源代码编译protobuf,没有使用install命令安装到系统目录中,目录结构如下:

修改rpath解决linux(ubuntu)运行 cannot open shared object file

此时如果在bin目录执行./protoc是会出错的:

修改rpath解决linux(ubuntu)运行 cannot open shared object file

总结(放在前面):

chrpath -r ../lib protoc
patchelf --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

修改rpath解决linux(ubuntu)运行 cannot open shared object file

2. 修改protoc的rpath:chrpath -r ../lib protoc

修改rpath解决linux(ubuntu)运行 cannot open shared object file

3. 查看以下修改后的rpath: readelf -d protoc

修改rpath解决linux(ubuntu)运行 cannot open shared object file

4. 修改libprotoc.so.32的rpath: patchelf --set-rpath ../lib/ libprotoc.so.32

5. 查看依赖: ldd protoc,此时已经没有not found了

修改rpath解决linux(ubuntu)运行 cannot open shared object file

其他方法

  • 可以在编译的时候设置rpath。个人喜好如果是我自己的东西我会这样作,别人的东西就不去修改编译过程了

参考链接

https://blog.csdn.net/sinat_35178307/article/details/109164966

© 版权声明

相关文章

暂无评论

none
暂无评论...