天天看點

GNU Binutils工具簡介

Binutils (2.14): 

ftp://ftp.gnu.org/gnu/binutils/

Binutils的内容

Binutils 是一組開發工具,包括連接配接器,彙編器和其他用于目标檔案和檔案的工具。

安裝下列程式: addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings 和 strip

安裝下列庫檔案: libiberty.a, libbfd.[a,so] 和 libopcodes.[a,so]

·   as   GNU的彙編器 

作為 GNU Binutils工具集中最重要的工具之一。as工具主要用來将彙編語言編寫的源程

序轉換成二進制形式的目标代碼。Linux平台的标準彙編器是GAS,它是 GNU GCC編譯器

所依賴的背景彙編工具,通常包含在 Binutils軟體包中。 

·   ld   GNU的連結器 

同as一樣,ld也是GNU Binutils工具集中重要的工具,Linux 使用 ld作為标準的連結程

序,由彙編器産生的目标代碼是不能直接在計算機上運作的,它必須經過連結器的處理才能

生成可執行代碼,連結是建立一個可執行程式的最後一個步驟,ld可以将多個目标檔案連結

成為可執行程式,同時指定了程式在運作時是如何執行的。

·   add2line   将位址轉換成檔案名或行号對,以便調試程式 

·   ar  從檔案中建立、修改、擴充檔案 

·   gasp  彙編宏處理器 

·   nm  從目标代碼檔案中列舉所有變量(包括變量值和變量類型),如果沒有指定目标

檔案,則預設是a.out檔案 

·   objcopy   objcopy工具使用GNU BSD 庫,它可以把目标檔案的内容從一種檔案格式

複制到另一種格式的目标檔案中 

在預設的情況下, GNU編譯器生成的目标檔案格式為elf格式, elf檔案由若幹段 (section)

組成,如果不作特殊指明,由 C 源程式生成的目标代碼中包含如下段:.text(正文段)包含

程式的指令代碼;.data(資料段)包含固定的資料,如常量、字元串;.bss(未初始化資料段)

包含未初始化的變量、 數組等。 C++源程式生成的目标代碼中還包括.fini (析構函數代碼)和.init

(構造函數代碼)等。連結生成的elf格式檔案還不能直接下載下傳到目标平台來運作執行,需要

通過 objcopy 工具生成最終的二進制檔案。連接配接器的任務就是将多個目标檔案的.text、.data

和.bss等段連接配接在一起,而連接配接腳本檔案是告訴連接配接器從什麼位址開始放置這些段。 

·   add2line   把程式位址轉換為檔案名和行号

在指令行中帶一個位址和一個可執行檔案名,它就會使用這個可執行檔案的調試資訊指

出在給出的位址上是哪個檔案以及行号。 

·   objdump   顯示目标檔案資訊 

objdump工具可以反編譯二進制檔案,也可以對對象檔案進行反彙編,并檢視機器代碼。  

·   readelf  顯示elf檔案資訊 

readelf指令可以顯示符号、段資訊、二進制檔案格式的資訊等,這在分析編譯器如何從

源代碼建立二進制檔案時非常有用。 

·   ranlib   生成索引以加快對歸檔檔案的通路,并将其儲存到這個歸檔檔案中 

在索引中列出了歸檔檔案各成員所定義的可重配置設定目标檔案。 

·   size  列出目标子產品或檔案的代碼尺寸 

size 指令可以列出目标檔案每一段的大小以及總體的大小。預設情況下,對于每個目标

檔案或者一個歸檔檔案中的每個子產品隻産生一行輸出。 

·   strings  列印可列印的目标代碼字元(至少 4 個字元) ,列印字元多少可以控制 

對于其他格式的檔案,列印字元串。列印某個檔案的可列印字元串,這些字元串最少 4

個字元長,也可以使用選項“-n”設定字元串的最小長度。預設情況下,它隻列印目标檔案

初始化和可加載段中的可列印字元;對于其他類型的檔案它列印整個檔案的可列印字元,這

個程式對于了解非文本檔案的内容很有幫助。 

·   strip  放棄所有符号連接配接

删除目标檔案中的全部或者特定符号。 

·   c++filt  連結器ld使用該指令可以過濾 C++符号和 Java 符号,防止重載函數沖突 

·   gprof   顯示程式調用段的各種資料