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

讀者留言 (0)

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。