所謂「如何找到程式所需(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