红联Linux门户
Linux帮助

PatchELF修改linux下elf文件library搜索路径

发布时间:2016-01-30 10:50:28来源:linux网站作者:功名半纸

下载patchelf-0.8.tar.bz2并安装:

wget http://nixos.org/releases/patchelf/patchelf-0.8/patchelf-0.8.tar.bz2 
tar -zxf patchelf-0.8.tar.bz2 
cd patchelf-0.8 
./configure --prefix=/usr 
make && make install 


修改前:
readelf -d cc1 

ynamic section at offset 0xd49728 contains 28 entries: 
TagType Name/Value 
0x0000000000000001 (NEEDED) Shared library: [libcloog-isl.so.4] 
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2] 
0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 
0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2] 
0x000000000000000c (INIT)   0x4f8e18 
0x000000000000000d (FINI)   0xd36e1c 
0x0000000000000019 (INIT_ARRAY) 0x1344ab8 
0x000000000000001b (INIT_ARRAYSZ)   224 (bytes) 
0x000000000000001a (FINI_ARRAY) 0x1344b98 
0x000000000000001c (FINI_ARRAYSZ)   8 (bytes) 
0x000000006ffffef5 (GNU_HASH)   0x400298 
0x0000000000000005 (STRTAB) 0x46ca58 
0x0000000000000006 (SYMTAB) 0x419a30 
0x000000000000000a (STRSZ)  529715 (bytes) 
0x000000000000000b (SYMENT) 24 (bytes) 
0x0000000000000015 (DEBUG)  0x0 
0x0000000000000003 (PLTGOT) 0x134a1e8 
0x0000000000000002 (PLTRELSZ)   9312 (bytes) 
0x0000000000000014 (PLTREL) RELA 
0x0000000000000017 (JMPREL) 0x4f69b8 
0x0000000000000007 (RELA)   0x4f4ed0 
0x0000000000000008 (RELASZ) 6888 (bytes) 
0x0000000000000009 (RELAENT)24 (bytes) 
0x000000006ffffffe (VERNEED)0x4f4e40 
0x000000006fffffff (VERNEEDNUM) 3 
0x000000006ffffff0 (VERSYM) 0x4edf8c 
0x0000000000000000 (NULL)   0x0 


# ldd cc1 
linux-vdso.so.1 =>  (0x00007fff20dff000) 
libcloog-isl.so.4 => not found 
libdl.so.2 => /lib64/libdl.so.2 (0x000000320d400000) 
libm.so.6 => /lib64/libm.so.6 (0x000000320d000000) 
libc.so.6 => /lib64/libc.so.6 (0x000000320c800000) 
/lib64/ld-linux-x86-64.so.2 (0x000000320c400000) 


利用patchelf修改路径:

patchelf  --set-rpath /opt/gcc-4.8.5/builddir/cloog-install/lib/ cc1 


查看最新信息:

# readelf  -d cc1 

Dynamic section at offset 0x270 contains 29 entries: 
TagType Name/Value 
0x000000000000001d (RUNPATH)Library runpath: [/opt/gcc-4.8.5/builddir/cloog-install/lib/] 
0x0000000000000001 (NEEDED) Shared library: [libcloog-isl.so.4] 
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2] 
0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 
0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2] 
0x000000000000000c (INIT)   0x4f8e18 
0x000000000000000d (FINI)   0xd36e1c 
0x0000000000000019 (INIT_ARRAY) 0x1344ab8 
0x000000000000001b (INIT_ARRAYSZ)   224 (bytes) 
0x000000000000001a (FINI_ARRAY) 0x1344b98 
0x000000000000001c (FINI_ARRAYSZ)   8 (bytes) 
0x000000006ffffef5 (GNU_HASH)   0x4d3a18 
0x0000000000000005 (STRTAB) 0x3ff490 
0x0000000000000006 (SYMTAB) 0x4809f0 
0x000000000000000a (STRSZ)  529758 (bytes) 
0x000000000000000b (SYMENT) 24 (bytes) 
0x0000000000000015 (DEBUG)  0x0 
0x0000000000000003 (PLTGOT) 0x134a1e8 
0x0000000000000002 (PLTRELSZ)   9312 (bytes) 
0x0000000000000014 (PLTREL) RELA 
0x0000000000000017 (JMPREL) 0x4f69b8 
0x0000000000000007 (RELA)   0x4f4ed0 
0x0000000000000008 (RELASZ) 6888 (bytes) 
0x0000000000000009 (RELAENT)24 (bytes) 
0x000000006ffffffe (VERNEED)0x4f4e40 
0x000000006fffffff (VERNEEDNUM) 3 
0x000000006ffffff0 (VERSYM) 0x4edf8c 
0x0000000000000000 (NULL)   0x0


# ldd cc1 
linux-vdso.so.1 =>  (0x00007fff8e3ff000) 
libcloog-isl.so.4 => /opt/gcc-4.8.5/builddir/cloog-install/lib/libcloog-isl.so.4 (0x00007fdaac630000) 
libdl.so.2 => /lib64/libdl.so.2 (0x000000320d400000) 
libm.so.6 => /lib64/libm.so.6 (0x000000320d000000) 
libc.so.6 => /lib64/libc.so.6 (0x000000320c800000) 
/lib64/ld-linux-x86-64.so.2 (0x000000320c400000) 
libgmp.so.3 => /usr/lib64/libgmp.so.3 (0x000000320e000000) 


注:
才发现RHEL 已经自带了chrpath工具,直接使用即可. ( yum install chrpath)

不过chrpath 有个缺陷,如果当前系统为x86_64,则修改i386 elf会报错,patchelf则无此问题!


本文永久更新地址:http://www.linuxdiyf.com/linux/17787.html