GNU Binutils工具介紹

網址一:http://linux.chinaitlab.com/manual/htmlbook/appendixa/binutils.html

網址二:http://blog.csdn.net/yf24518150/article/details/4972632

 

GNU Binutils工具介紹

在Linux下建立嵌入式交叉編譯環境要用到一些列的工具鏈(tool-chain),主要有比如GNU Binutils、Gcc、Glibc、Gdb等,它們都屬於GNU的工具集。其中GNU Binutils是一套用來構造和使用二進制所需的工具集。建立嵌入式交叉編譯環境,Binutils工具包是必不可少的,而且Binutils與GNU的C編譯器gcc是緊密相集成的,沒有Binutils,gcc也不能正常工作的。Binutils的官方下載地址是:ftp://ftp.gnu.org/gnu/binutils/,在這裏可以下載到不同版本的Binutils工具包。目前比較新的版本是Bintuils-2.16.1。GNU Binutils工具集裏主要有以下一些列的部件。

l        as GNU的彙編器

作爲GNU Binutils工具集中最重要的工具之一。as工具主要用來將彙編語言編寫的源程序轉換成二進制形式的目標代碼。Linux平臺的標準彙編器是GAS,它是Gnu GCC編譯器所依賴的後臺彙編工具,通常包含在Binutils軟件包中。

l        ld GNU的鏈接器

同as一樣,ld也是GNU Binutils工具集中重要的工具,Linux使用ld作爲標準的鏈接程序,由彙編器產生的目標代碼是不能直接在計算機上運行的,它必須經過鏈接器的處理才能生成可執行代碼,鏈接是創建一個可執行程序的最後一個步驟,ld可以將多個目標文件鏈接成爲可執行程序,同時指定了程序在運行時是如何執行的。

l        add2line 將地址轉換成文件名或行號對,以便調試程序

在命令行中帶一個地址和一個可執行文件名,它就會使用這個可執行文件的調試信息指出在給出的地址上是哪個文件以及行號。

l        ar 從文件中創建、修改、擴展文件

l        gasp 彙編宏處理器

l        nm 從目標代碼文件中例舉所有變量(包括變量值和變量類型),如果沒有指定目標文件,則默認是a.out文件

l        objcopy objcopy工具使用GNU BSD庫,它可以把目標文件的內容從一種文件格式複製到另一種格式的目標文件中。

在默認的情況下,GNU編譯器生成的目標文件各式爲elf格式,elf文件由若干段(section)組成,如果不做特殊指明,由C源程序生成的目標代碼中包含如下段:

text(正文段)包含程序的指令代碼;

.data(數據段)包含固定的數據,如常量、字符串;

.bss(未初始化數據段)包含爲初始化的變量、數組等。

C++源程序生成的目標代碼中還包含.fini(析構函數代碼)和.init(構造函數代碼)等。鏈接生成的elf格式文件還不能直接下載到目標平臺來運行執行,需要通過objcopy工具生成最終的二進制文件。鏈接器的任務就是將多個目標文件的.text、.data和.bss等段連接在一起,而連接腳本文件是告訴連接器從什麼地址開始放置這些段。

l        objdump 顯示目標文件信息

objdump工具可以反編譯二進制文件,也可以對對象文件進行反彙編,並查看機器代碼。

l        readelf 顯示elf文件信息

readelf命令可以顯示符號、段信息、二進制文件格式的信息等,這在分析編譯器如何工從源代碼創建二進制文件時非常有用。

l        ranlib 生成索引以加快對歸檔文件的訪問,並將結果保存到這個歸檔文件中

在索引中列出了歸檔文件各個成員所定義的可重分配目標文件。

l        size 列出目標模塊或文件的代碼尺寸

size命令可以列出目標文件每一段的大小以及總體的大小。默認的情況下,對於每個目標文件或者一個歸檔文件中的每個模塊只產出一行輸出。

l        strings 打印可打印的目標代碼字符(至少4個字符),打印字符多少可以控制

對於其它各式的文件,打印字符串。打印某個文件的可打印字符串,這些字符串最少4個字符長,也可以使用選項“-n”設置字符串的最小長度。默認情況下,它只打印目標文件初始化和可加載段中的可打印字符;對於其他類型的的文件它打印整個文件的可打印字符,這個程序對於瞭解非文本文件內容很有幫助。

l        strip 放棄所有符號連接

刪除目標文件中的全部或者特定符號

l        c++filt 鏈接器ld使用該命令可以過濾C++符號和JAVA符號,防止重載函數衝突

l        gprof 顯示程序調用段的各種數據

2.2 Binutils工具軟件使用

就Binutils工具軟件的使用問題,以下以Binutils工具包中兩個常用工具的使用進行簡單的說明。

1、彙編器

Linux平臺的標準彙編器是GAS,它是GCC所依賴的後臺彙編工具,通常包含在bintuils軟件包中。GAS使用標準的AT&T彙編語法,可以用來彙編AT&T格式編寫的程序,例如可以這樣來編譯彙編語言編寫的源程序test.s。

[root@localhost] # as –o test.o test.s

2、鏈接器

GNU鏈接器使用一個命令語言腳本來控制鏈接過程。默認情況下,ld是由一組內部命令進行控制的,這些命令可以進行擴展或覆蓋。強調可移植性和靈活性在GCC的功能中是非常明顯的一條,它可以爲很多不同的編譯環境生成鏈接腳本,並向ld傳遞定製過的鏈接腳本,而不是用手工干預。

需要注意的是,在Linux下編寫應用程序(假定採用GCC編譯器)時,GCC編譯器內置缺省的鏈接腳本。如果採用缺省腳本,需要操作系統才能加載運行。

就像前面講到的,由彙編器產生的目標代碼是不能直接在計算機上運行的,它必須經過鏈接器的處理才能生成可執行代碼。Linux使用ld作爲標準的鏈接程序,比如我們可以用下面的方法來鏈接上述編譯的程序

[root@localhost]# ld –s –o test test.o

這樣就產生了最終的可執行程序test。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章