熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Linux 動態函式庫解析(一)

2013-11-13 16:19:12  來源: Oracle 

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