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