摘要:使用動態函式庫的好處有許多
首先
就是由於執行檔主要呼叫的函式都包含於動態函式庫中
所以檔案所占的空間可以因而縮小
其次
當動態函式庫的函式內容有所改變時
呼叫該動態函式庫的程序
可以在最小修正甚至是不需重新編程的情況下
就可以叫用到新版本的函式庫服務
前言
用 MS Windows 一段時間的讀者
應該都聽過動態函式庫這個名詞
在 Windows
X/ME 或是 Windows NT/
中
常見到的動態函式庫為副檔名
DLL
(Dynamic Loading Library)的檔案
而在 Linux 中
當然也有動態函式庫的機制存在
如此一來
所撰寫的程序便無需透過靜態連結(Static Link)
而可以在編程時透過動態連結(Dynamic Link)產生我們所要的執行檔
使用動態函式庫的好處有許多
首先
就是由於執行檔主要呼叫的函式都包含於動態函式庫中
所以檔案所占的空間可以因而縮小
其次
當動態函式庫的函式內容有所改變時
呼叫該動態函式庫的程序
可以在最小修正甚至是不需重新編程的情況下
就可以叫用到新版本的函式庫服務
對於發展 Embedded Linux 的業者來說
能夠盡可能減少應用程序執行環境所需空間的大小
便可以把日後成品所需的 Flash 容量降到最低
在整體成本以及所耗用的記憶體空間來說
都可以得到許多的好處
而在動態函式庫來著手所得到的效益也是相當可觀的
盡可能的刪去不必要的動態函式庫
以及針對動態函式庫改寫來縮小或是透過工具刪去用不到的函式
都可以帶來許多的助益
當然棉
動態函式庫的好處還不只這些
相信讀者們在文章中可以發現其它的妙用的
檔案格式(ELF VS A
out)
首先
我們必須先確定目前所執行的 Linux Kernel 版本有開啟 ELF 與 A
out 執行檔案格式的支援(通常都會有)
Kernel support for a
out binaries (CONFIG_BINFMT_AOUT) [M/n/y/?]
Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/m/n/?]
舉個例子來說
若要執行 a
out 格式的執行檔時
我們必須確認 CONFIG_BINFMT_AOUT 為 Y
也就是由 Kernel 直接支援 a
out 檔案格式
或者 CONFIG_BINFMT_AOUT 為 M
也就是不把 a
out 的檔案格式支援編入Kernel 中
改以 Module 的形式存在
一旦 Kernel 需要執行 a
out 格式的程序時
在動態的載入該 Module
來啟動具備執行 a
out 執行檔的能力
不過a
out 執行檔的格式
是 Unix 上使用了相當久的的檔案格式
ELF 是目前較新的的檔案格式
a
out 檔案格式共有三個 Section
分別為
text
data
及
bss
並還包括了一個文字表(String Table)與符號表(Symbol Table)
與ELF 檔案格式比較起來
a
out 相形之下顯得較為缺乏彈性
ELF檔案格式允許多個節區的存在
執行檔可以根據需求提供應用程序執行環境的節區
並且ELF 檔支援了
bit 與
bit 的執行環境
其實
兩者之間還有其它規格上的不同
有興趣的讀者也可以自行找一些相關的資料來比較即可了解
再來呢
我們就來討論動態函式庫的檔案格式
我們都知道在 Linux中有 a
out 與 ELF 兩種檔案的格式
其中目前我們最常見的便是 ELF 檔案格式
在 Linux 的函式庫目錄中
我們常常可以見到
*
so
的檔案
例如:
/lib/libc
so
或是
/lib/ld
linux
so
這些便是在 Linux中所常見到的動態函式庫檔案
由下圖我們可以看到動態函式庫 libc
so
的 ELF Header:
libc
so
的 ELF Header
e_ident
>EI_MAG
:
fh
>EI_MAG
:E
>EI_MAG
:L
>EI_MAG
:F
>EI_CLASS:
bit objects
>EI_DATA:ELFDATA
LSB
>EI_VERSION:
h
>EI_PAD:
h
>EI_NIDENT:
h
e_type: ET_DYN (Shared Obj File)
e_machine:Intel
e_version:Current version
e_entry:
a
h
e_phoff:
h
e_shoff:
bbf
ch
e_flags:
h
e_ehsize:
h
e_phentsize:
h
e_phnum:
h
e_shentsize:
h
e_shnum:
h
e_shstrndx:
dh
由圖中
我們可以注意到 e_type: ET_DYN
e_type 是在ELF 檔案的格式中
用來描述目前該檔的檔案型態
我們所舉的例子為 libc
so
這個動態函式庫的檔案
所以 e_type 的屬性為 Shared Obj File
當然棉
我們若再拿一個ELF執行檔來比較也是不錯的
所以如下圖
ls 的 ELF Header
e_ident
>EI_MAG
:
fh
>EI_MAG
:E
>EI_MAG
:L
>EI_MAG
:F
>EI_CLASS:
bit objects
>EI_DATA:ELFDATA
LSB
>EI_VERSION:
h
>EI_PAD:
h
>EI_NIDENT:
h
e_type: ET_EXEC (Executable file)
e_machine:Intel
e_version:Current version
e_entry:
h
e_phoff:
h
e_shoff:bea
h
e_flags:
h
e_ehsize:
h
e_phentsize:
h
e_phnum:
h
e_shentsize:
h
e_shnum:
ah
e_shstrndx:
h
我們可以注意到 e_type: ET_EXEC
這就是 ELF 檔中對於執行檔所定義的檔案屬性
From:http://tw.wingwit.com/Article/program/Oracle/201311/18141.html