概述
從事 Linux 開發的朋友們都不可避免地用到一些工具,比如 objcopy、nm、objdump、readelf 等等。其實這一系列的工具,就是所謂的 Binutils,當然 GNU 就表示它們都是可以自由地使用的 GNU 軟體。
GNU Binutils,是 GNU Binary Utilities 的簡寫,一般簡稱為 Binutils。中文可以翻譯為 GNU 的二進制工具集。顯然,Binutils 是一組二進制工具的集合。也就是說,Binutils 不是指某一個工具,而是指一組工具,并且這些工具都是專門針對于二進制的。注意,這裡千萬不要了解錯了,不是說這些 Binutils 工具隻提供二進制檔案,而是說這些工具的目的是用于操作二進制檔案的,而不是針對于文本或者源代碼。
再說一遍:Binutils 工具是專門用于操作二進制的,而不是用于去操作或者編譯文本、源代碼的。
在 Linux 環境下,這種二進制檔案主要指 *.o 檔案和 elf 執行檔案。顯然,編譯源代碼的是 gcc,是以 Binutils 不包含 gcc(這是一種簡單的說法,實際上還是有很多關聯的)。
Binutils 工具
現在我們已經知道,Binutils 是一組工具集合,那到底包含了哪些工具呢?
Binutils 中比較重要的是 ld 和 as。
-
ld —— 連結器
将多個目标檔案,連結成一個可執行檔案(或目标庫檔案)。
-
as —— 彙編器
将彙編源代碼,編譯為(目标)機器代碼。
另外還有下面這些相對次要的,但非常實用的工具:
-
addr2line
将位址轉換為(檔案名和)行号的工具,一般主要用于反彙編。
-
ar
用來操作(.a)檔案檔案,比如建立,修改,提取内容等
-
c++filt
Filter to demangle encoded C++ symbols
-
dlltool
Creates files for building and using DLLs
-
gold
一個新的,速度更快的,隻針對于ELF的連結器(可能還不是很成熟穩定)。
-
gprof
Displays profiling information
-
nlmconv
Converts object code into an NLM
-
nm
列出目标檔案中的符号
-
objcopy
拷貝并翻譯(轉換)檔案,可用于不同格式的二進制檔案的轉換。
-
objdump
顯示目标檔案中的資訊。
-
ranlib
Generates an index to the contents of an archive
-
readelf
顯示 ELF 格式的(目标)檔案的資訊。
-
size
顯示目标檔案或(.a)檔案檔案中的節(section)的大小。
-
strings
顯示檔案中的(可列印)的字元串資訊。
-
strip
去除符号。一般用來把可執行檔案中的一些資訊(比如 debug 資訊)去除掉,以實作在不影響程式功能的前提下,減少可執行檔案的大小,減少程式的空間占用。
-
windmc
A Windows compatible message compiler
-
windres
A compiler for Windows resource files