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

本文介绍了如何使用PatchELF工具在Linux环境下修改C/C++程序的动态链接库搜索路径,包括下载、安装PatchELF的过程,并展示了通过readelf和ldd命令检查库依赖及修改后的效果。
摘要由CSDN通过智能技术生成

C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径。自己指定的路径就不说了,这里说明一下系统自动搜索的路径。 【1】include头文件路径     除了默认的/usr/include, /usr/local/include等

http://nixos.org/patchelf.html

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

Dynamic section at offset 0xd49728 contains 28 entries:

Tag Type 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:

Tag Type 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则无此问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值