Linux 下的 object 與 library 檔

從客戶那邊拿到一個 Linux 下的源代碼, 例行 ./config, ./make 之後, 在我的 Cygwin 底下生出很多檔案, 但是並沒有一個執行檔, 倒是有很多 .lo 和 .la, 這是平常我們用自家開發的 embedde system tool chain 所不會遇到的. 這些是甚麼東西呢?

首先我們要瞭解為何需要 L 字頭的檔案, 而不是 .o 或 .a 就好? 原因在於要支持動態連結 (dynamic link). Libtool 就是這樣的一個工具, 以便產生出有益於 dynamic link 的 .o 與 .a, 也就是 .lo 與 .la.

.la 檔是一個文字檔, 裡面描述了此 library 的 version, name 等等, 當然也定義了 dlopen, dlpreopen 要去開哪個 library. 靜態連結與動態連結的 library 分別記錄在 old_libaray = 'libxxx.a' 與 library_names = ' ' 的條目之下. 據說 .la 檔也可以包含另一個 .la 檔, 但我沒看過實例.

.lo 檔也是文字檔, 裡面大概包含 PIC object 和 non-PIC object 的 object name. 所謂 PIC 就是 position-independent code 的意思. 如果程式碼與 position 相關, 當然就不容易動態連結囉!

既然 .la 和 .lo 都是文字檔, 因此它們只是 libtool 底下的溝通工具, 透過 libtool 做 link 的時候, 它們便擔任把真正的 .a 和 .o 傳給 gcc 給工具. 

.so 這東西就是指 shared object, 適用於動態連結, 而 .o 就適合靜態連結, .a 則是 .o 的集合, 也就是靜態的 library.

[ref]

1. http://www.eetop.cn/blog/html/40/202640-8862.html (簡體)

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

%d 位部落客按了讚: