ELF 之 Dynamic Linking 觀念教學, #2: DT_NEEDED 基本概念

jollen 發表於 April 17, 2007 10:53 PM

所謂「如何找到程式所需(depends)的程式庫」並非一件很技術面的事情,程式經常會呼叫程式庫裡的函數,並且由於 Linux 是 shared library 系統,因此 程式執行時,如何找到程式需要的程式庫,其實是一件很自然的事情。

程式所需的程式庫,稱為相依性程式庫,即 library dependencies;並且,程式庫也會再相依其他的程式庫,因此,找出 library dependencies 是一種拓樸邏輯關係。

由 dynamic linker 的實作角度來說,程式的 library dependencies 紀錄在 dynamic segment 的 DT_NEEDED entry 裡,dynamic linker 便是由 DT_NEEDED 為起點,建立 library dependencies 關係圖,此圖又稱做 NEEDED list。

例如,若程式相依 libm 與 libc,那麼,DT_NEEDED entry 的內容就會是:

# readelf -d test

Dynamic segment at offset 0x494 contains 21 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x80482a4
 0x0000000d (FINI)                       0x8048460
...

使用 ldd 也能觀察到 library dependencies:

# ldd test
        libm.so.6 => /lib/tls/libm.so.6 (0x40026000)
        libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

熟悉 embedded Linux 系統建置的朋友想必對這個部份不感到陌生,現在我們終於知道 library dependencies 是紀錄在 dynamic segment 的 DT_NEEDED 裡,對於 dynamic linking 的研究又跨出了一大步。

來源: Jollen's Blog

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw