Linker 如何查看共享库加载的顺序
给定一个ELF二进制或共享对象,我如何才能最容易地看到所需共享库的加载顺序 它们是否按照Linker 如何查看共享库加载的顺序,linker,shared-libraries,elf,Linker,Shared Libraries,Elf,给定一个ELF二进制或共享对象,我如何才能最容易地看到所需共享库的加载顺序 它们是否按照readelf-d列出的顺序加载 如何才能最容易地查看所需共享库的加载顺序 使用LD\u调试: LD_DEBUG=files /bin/ls 13444: 13444: file=libc.so.6 [0]; needed by who [0] ... 13444: file=libnss_files.so.2 [0]; needed by who [0] ... 有关更多信息,请访问m
readelf-d
列出的顺序加载
如何才能最容易地查看所需共享库的加载顺序
使用LD\u调试:
LD_DEBUG=files /bin/ls
13444:
13444: file=libc.so.6 [0]; needed by who [0]
...
13444: file=libnss_files.so.2 [0]; needed by who [0]
...
有关更多信息,请访问man ld.so
它们是否按照readelf-d列出的顺序加载
不一定会受到预加载(LD_PRELOAD
,/etc/LD.so.PRELOAD
)的影响。使用LD_DEBUG=files
可以查看库的搜索顺序和初始化顺序。后者可能与前者不同
它们是否按照readelf-d
这取决于你所说的“加载”是什么意思。库的初始值设定项返回后即“完全加载”
根据该定义,否:readelf-d
中列出的NEEDED
依赖项的顺序与加载顺序不同
考虑a.out
,它取决于libA.so
和libB.so
:
readelf -d a.out | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libA.so]
0x0000000000000001 (NEEDED) Shared library: [libB.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
readelf -d libA.so | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libC.so]
0x0000000000000001 (NEEDED) Shared library: [libD.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
此外,libA.so
本身取决于libC.so
和libD.so
:
readelf -d a.out | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libA.so]
0x0000000000000001 (NEEDED) Shared library: [libB.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
readelf -d libA.so | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libC.so]
0x0000000000000001 (NEEDED) Shared library: [libD.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
搜索库的顺序:
LD_DEBUG=files ./a.out |& grep 'needed by'
49169: file=libA.so [0]; needed by ./a.out [0]
49169: file=libB.so [0]; needed by ./a.out [0]
49169: file=libc.so.6 [0]; needed by ./a.out [0]
49169: file=libC.so [0]; needed by ./libA.so [0]
49169: file=libD.so [0]; needed by ./libA.so [0]
库“完全加载”的顺序:
可能影响装货顺序的其他因素:
LD\u预加载
或/etc/LD.so.PRELOAD
任何库都可以在其初始值设定项中执行dlopen
谢谢你的详细回答。特别是,知道初始化顺序不一定与库加载顺序相同对我很有用(将来可能对其他人也是如此)。出于上下文考虑,我问这个问题的原因是我们对库初始化器有一个排序条件,但它们没有设置的优先级。在我想出解决办法之前,我想确定我理解了这个问题。