2016-11-16 59 views

回答

0

我怎樣才能最容易地看到所需共享庫的加載順序?

使用LD_DEBUG:

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] 
... 

欲瞭解更多信息的人ld.so.

它們是按照它們按readelf -d列出的順序加載的嗎?

不一定例如它會受到預加載的影響(LD_PRELOAD/etc/ld.so.preload)。

3

使用LD_DEBUG=files可讓您查看庫以何種順序搜索,其中包括,它們的初始化順序如下。後者可能與前者不同。

他們是在他們列出的順序裝載到由readelf -d

取決於你的意思是「裝」什麼。一旦初始化程序返回,庫就會「完全加載」。

根據該定義,否:在readelf -d中列出的NEEDED依賴項的順序和加載順序不相同。

考慮a.out取決於libA.solibB.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] 

並進一步libA.so本身取決於libC.solibD.so

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_DEBUG=files ./a.out |& grep 'calling init' 
    69038: calling init: /lib/x86_64-linux-gnu/libc.so.6 
    69038: calling init: ./libD.so 
    69038: calling init: ./libC.so 
    69038: calling init: ./libB.so 
    69038: calling init: ./libA.so 

,可能會影響加載順序的其他因素:

  1. LD_PRELOAD/etc/ld.so.preload
  2. 任何庫都可以在其初始化程序中執行dlopen
+0

謝謝你的詳細解答。尤其是,知道初始化順序不一定與庫加載順序相同對於我(可能對未來其他人)很有用。 –

+0

對於上下文,我問這個問題的原因是我們對庫初始化程序有一個排序條件,但它們沒有設置優先級。我想在確定解決問題之前確定我已經理解了這個問題。 –