一.Linux加载Lib优先级:
总的来说,优先级方案可以归类为以下两种版本 。(LD_PRELOAD的优先级最高)
一.如果指定了 RUNPATH 字段(即 DT RUNPATH 字段非空):
1 ) LD LIBRARY PATH 。
2) runpath (DT_RUNPATH 宇段) 。
3 ) Id.so .cache 。
4) 默认库路径(Ilib 和 /usr/lib) 。
二.如果没有指定 RUNPATH 字段( 即 DT RUNPATH 宇段为空字符串):
1 )被加载库的 RPATH ,然后是二进制文件的 RPATH ,直到可执行文件或者动态库将这
些库全部加载完毕为止 。
2) LD LIBRARY PATH 。
3 ) Id.so.cache 。
4 ) 默认库路径(/Iib 和 /usr/lib) 。
二.查看runpath
/home# readelf -d aa
Dynamic section at offset 0xd60 contains 30 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libtest.so]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000001d (RUNPATH) Library runpath: [/home/kehao/Learn/c++/lib2]
0x000000000000000c (INIT) 0x898
0x000000000000000d (FINI) 0xb74
0x0000000000000019 (INIT_ARRAY) 0x200d48
0x000000000000001b (INIT_ARRAYSZ) 16 (bytes)
0x000000000000001a (FINI_ARRAY) 0x200d58
0x000000000000001c (FINI_ARRAYSZ) 8 (bytes)
0x000000006ffffef5 (GNU_HASH) 0x298
0x0000000000000005 (STRTAB) 0x4b8
0x0000000000000006 (SYMTAB) 0x2d8
0x000000000000000a (STRSZ) 449 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x200f80
0x0000000000000002 (PLTRELSZ) 144 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x808
0x0000000000000007 (RELA) 0x6e8
0x0000000000000008 (RELASZ) 288 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000000000001e (FLAGS) BIND_NOW
0x000000006ffffffb (FLAGS_1) Flags: NOW PIE
0x000000006ffffffe (VERNEED) 0x6a8
0x000000006fffffff (VERNEEDNUM) 2
0x000000006ffffff0 (VERSYM) 0x67a
0x000000006ffffff9 (RELACOUNT) 4
0x0000000000000000 (NULL) 0x0
三.查看程序运行时库的搜索情况
方法一:
LD_DEBUG=libs ./aa
方法二:
strace ./aa