Linker 如何查看共享库加载的顺序

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

给定一个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]
...
有关更多信息,请访问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

  • 谢谢你的详细回答。特别是,知道初始化顺序不一定与库加载顺序相同对我很有用(将来可能对其他人也是如此)。出于上下文考虑,我问这个问题的原因是我们对库初始化器有一个排序条件,但它们没有设置的优先级。在我想出解决办法之前,我想确定我理解了这个问题。