c0d3n4m 发表于 2022-6-24 12:14

修改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]
查看完整版本: 修改rpath解决linux(ubuntu)运行'cannot open shared object file'