Linux下应用程序so库链接路径rpath修改【包含示例,超详细】 二

Linux下应用程序so库链接路径rpath修改【超详细】 一

一 rpath参数

rpath 参数是指定库运行时首先加载系统依赖库的路径,如果找不到依赖库将到系统默认的路径库查找

二 chrpath 修改rpath

chrpath --help
Usage: chrpath [-v|-d|-c|-r <path>] <program> [<program> ...]

   -v|--version                Display program version number
   -d|--delete                 Delete current rpath/runpath setting
   -c|--convert                Convert rpath to runpath
   -r <path>|--replace <path>  Replace current rpath/runpath setting
                               with the path given
   -l|--list                   List the current rpath/runpath (default)
   -h|--help                   Show this usage information.

chrpath -l /lib/xxx.so 显示rpath路径
chrpath -r /lib64 /lib/xxx.so 修改rpath路径

三 patchelf设置rpath

patchelf --help
syntax: patchelf
  [--set-interpreter FILENAME]
  [--page-size SIZE]
  [--print-interpreter]
  [--print-soname] Prints 'DT_SONAME' entry of .dynamic section. Raises an error if DT_SONAME doesn't exist
  [--set-soname SONAME] Sets 'DT_SONAME' entry to SONAME.
  [--set-rpath RPATH]
  [--remove-rpath]
  [--shrink-rpath]
  [--print-rpath]
  [--force-rpath]
  [--add-needed LIBRARY]
  [--remove-needed LIBRARY]
  [--replace-needed LIBRARY NEW_LIBRARY]
  [--print-needed]
  [--no-default-lib]
  [--debug]
  [--version]
  FILENAME
patchelf --set-rpath  /lib64  /lib/xxx.so

四 示例

修改linssl.so.1.1依赖的libcrypto.so.1.1的路径

查看libssl.so.1.1的so库链接

ldd libssl.so.1.1 
	linux-vdso.so.1 (0x00007ffdc9972000)
	libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007faebd0f8000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007faebced9000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faebcae8000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007faebc8e4000)
	/lib64/ld-linux-x86-64.so.2 (0x00007faebd850000)

发现libssl.so.1.1依赖的libcrypto.so.1.1是系统的库,并不是自己同级文件夹下的库。通过

readelf -d  libssl.so.1.1

看到libssl.so.1.1并没有指定rpath,因此可利用patchelf设置libssl.so.1.1的rpath。

patchelf --set-rpath  ./  libssl.so.1.1

设置后

readelf -d libssl.so.1.1 

Dynamic section at offset 0x8d1c0 contains 32 entries:
  标记        类型                         名称/值
 0x000000000000001d (RUNPATH)            Library runpath: [./]
 0x0000000000000001 (NEEDED)             共享库:[libcrypto.so.1.1]
 0x0000000000000001 (NEEDED)             共享库:[libpthread.so.0]
 0x0000000000000001 (NEEDED)             共享库:[libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [libssl.so.1.1]
 0x000000000000000c (INIT)               0x1b9f8
 0x000000000000000d (FINI)               0x66fd8
 0x0000000000000019 (INIT_ARRAY)         0x2806b0
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x2806b8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 ...

此时查看libssl.so.1.1 的依赖库路径变为

ldd libssl.so.1.1 
	linux-vdso.so.1 (0x00007fffc01ea000)
	libcrypto.so.1.1 => ./libcrypto.so.1.1 (0x00007f9f34adb000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9f348bc000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9f344cb000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9f342c7000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f9f35238000)

说明设置成功!

参考链接

http://elincc.com/blog/detail/59f298a169f3153d348b226a

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巧笑笑笑倩兮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值