找回密码
 立即注册
查看: 289|回复: 0

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

[复制链接]
发表于 2022-6-24 12:14 | 显示全部楼层 |阅读模式
之前的修改方式是存在缺陷的,工作目录只能在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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-26 07:41 , Processed in 0.091797 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表