linux下的GNU工具集包括GNU Compiler Collection,也就是大名鼎鼎的GCC,還包括GNU Binutils,即GNU的二進制工具集。本節主要介紹GNU的二進制集,對我們在Linux下進行代碼的學習、調試非常有用。
readelf:可以顯示elf格式可執行文件的信息。elf格式是Unix/Linux平臺上應用最廣泛的二進制文件之一。
列出elf文件的頭信息:readelf -h a.out
Magic表示幻數,用來指明這個文件是一個elf文件,第一個字節7f是固定的數,45 4c 46分別是elf三個字母的ascii值。
nm:列出目標文件中的符號(函數、變量),常在調試時使用。
用法:nm a.out
size:列出目標文件每一段的大小以及總體的大小。
用法:size a.out
strings:列出目標文件中可打印的字符串。
用法:strings test.o
strip:瘦身,用來丟棄目標文件中的全部或者特定的符號,減小文件體積。
strip相當于脫衣服,對于嵌入式系統來說,這個命令必不可少。在strip之后,文件變小了,仍然可以執行,這就就節省了很多空間。strip不僅僅可以針對可執行文件,還能針對目標文件和動態庫等。在實際的開發中,經常需要對動態庫.so進行strip操作,減少占用空間。而在調試的時候(比如用addr2line),就需要符號了。因此,通常的做法是:strip前的庫用來調試,strip后的庫用來實際發布,他們兩者有對應關系。一旦發布的strip后的庫出了問題,就可以找對應的未strip的庫來定位。最后啰嗦一句,某某動態庫strip前是18M左右,strip后是3M左右,可見,脫脫衣服還是有明顯好處的。
用法:strip a.out,注意:strip不要瘦身.o的中間文件,否則會導致無法鏈接。
file:列出文件的信息
objcopy:目標文件格式轉換
objcopy -O binary a.out a.bin
objcopy -O binary u-boot u-boot.bin
將elf格式的文件轉換為二進制格式。
objdump:主要用來反匯編。
反匯編:把目標代碼轉為匯編代碼的過程,也可以說是把機器語言轉換為匯編語言代碼、低級轉高級的意思,常用于軟件破解、外掛技術、病毒分析、逆向工程、軟件漢化等領域。在此過程中我們可以領悟到軟件作者的編程思想。總之一句話:軟件一切神秘的運行機制全在反匯編代碼里面。目前網絡上的許多“免費軟件“都跟反匯編息息相關。
objdump -d a.out 輸出到終端
objdump -d a.out > test.dis
反匯編bin格式的文件:
objdump -D -b binary -m arm test.bin > test.dis
addr2line:將程序中的地址對應到文件名和相應的行號,程序運行出錯時,通常會返回一個地址,根據這個地址就可以定位到代碼出錯的位置。通常用于定位內核中的錯誤。
用法:addr2line 地址 -e a.out -f
注意,要想使用addr2line,要求elf文件在編譯的時候必須要添加-g參數。