天天看點

gcc編譯工具集中各軟體的用途,了解EFF檔案格式一、gcc編譯工具(二)EFF檔案格式

目錄

(一)、gcc編譯工具

(一)GCC

(二)GCC編譯過程

(二)EFF檔案格式

(三)GCC的常用指令

一、gcc編譯工具

(一)GCC

GCC(GNU C Compiler)是編譯工具。本文所要介紹的将 C/C++語言編寫的程式 轉換成為處理器能夠執行的二進制代碼的過程即由編譯器完成。

Binutils: 一組二進制程式處理工具,包括:addr2line、ar、objcopy、objdump、as、ld、 ldd、readelf、 size 等。這 一組工具是開發和調試不可缺少的工具 。

(1)addr2line:用來将程式位址轉換成其所對應的程式源檔案及所對應的代碼行,也可以得到所對應的函數。幫助調試器在調試的過程中定位對應的源代碼位置。

(2) as:主要用于将彙編語言編寫的源程式裝換成二進制形式的目标代碼。

(3) ld:主要用于将多個目标檔案連接配接成為可執行程式,同時指定程式在運作時是如何執行的。

(4) ar:從檔案中建立、修改和擴充檔案,主要用于建立靜态庫。

(5) ldd:可以用于檢視一個可執行程式依賴的共享庫。

(6) objcopy:将一種對象檔案翻譯成另一種格式,譬如将.bin 轉換成.elf、或 者将.elf 轉換成.bin 等。

(7) objdump:主要的作用是反彙編。既可以反彙編二進制檔案,也可以對對象檔案進行反彙編。

(8) readelf:顯示有關 ELF 檔案的資訊。

(9) size:列出可執行檔案每個部分的尺寸和總尺寸,代碼段、資料段、總大小等。
           

C運作庫

C 語言标準主要由兩部分組成:一部分描述C的文法,另一部分描述C标準庫。 C标準庫定義了一組标準頭檔案,每個頭檔案中包含一些相關的函數、變量、類型聲明和宏定義,譬如常見的printf函數便是一個 C标準庫函數,其原型定義在stdio頭檔案中。 C語言标準僅僅定義了C标準庫函數原型,并沒有提供實作。是以,C語言編譯器通常需要一個C運作時庫(C Run Time Libray,CRT)的支援。C 運作時庫又常簡稱為 C運作庫。與 C語言類似,C++也定義了自己的标準,同時提供相關支援庫,稱為C++運作時庫。

(二)GCC編譯過程

編譯階段    編譯指令    作用

預處理    gcc -E test.c -o test.i    編譯器将源代碼中包含頭檔案編譯進來

編譯       gcc -S test.i -o test.s    檢查代碼規範性并翻譯成彙編語言

彙編       gcc -c test.s -o test.o    将.s檔案轉換為目标檔案

連結       gcc test.o -o test           将目标檔案轉換為可執行檔案

預處理  gcc -E hello.c -o hello.i

生成hello.i檔案

gcc編譯工具集中各軟體的用途,了解EFF檔案格式一、gcc編譯工具(二)EFF檔案格式

編譯gcc -S hello.i -o hello.s

gcc編譯工具集中各軟體的用途,了解EFF檔案格式一、gcc編譯工具(二)EFF檔案格式

彙編 gcc -c hello.s -o hello.o

gcc編譯工具集中各軟體的用途,了解EFF檔案格式一、gcc編譯工具(二)EFF檔案格式

連結 gcc hello.o -o hello

gcc編譯工具集中各軟體的用途,了解EFF檔案格式一、gcc編譯工具(二)EFF檔案格式

(二)EFF檔案格式

1.ELF檔案

ELF檔案由4部分組成,分别是ELF頭(ELF header)、程式頭表(Program header table)、節(Section)和節頭表(Section header table)。實際上,一個檔案中不一定包含全部内容,而且它們的位置也未必如同所示這樣安排,隻有ELF頭的位置是固定的,其餘各部分的位置、大小等資訊由ELF頭中的各項值來決定。1

ELF檔案格式如下圖,位于ELF Header和Section Header Table 之間的都是段(Section)。一個典型的ELF檔案包含下面幾個段:

.text:已編譯程式的指令代碼段。

.rodata:ro 代表 read only,即隻讀資料(譬如常數 const)。

.data:已初始化的 C 程式全局變量和靜态局部變量。

.bss:未初始化的 C 程式全局變量和靜态局部變量。

.debug:調試符号表,調試器用此段的資訊幫助調試。

gcc編譯工具集中各軟體的用途,了解EFF檔案格式一、gcc編譯工具(二)EFF檔案格式

一個典型的 ELF 檔案包含下面幾個段:

.text:已編譯程式的指令代碼段。

.rodata:ro 代表 read only,即隻讀資料(譬如常數 const)。

.data:已初始化的 C 程式全局變量和靜态局部變量。

.bss:未初始化的 C 程式全局變量和靜态局部變量。

.debug:調試符号表,調試器用此段的資訊幫助調試。

(三)GCC的常用指令

-c:把源程式編譯為目标代碼,生成以同名的.o為字尾名的目标檔案。

-S:生成一個字尾名為.s的彙編語言檔案。

-e對檔案進行預處理,預處理的結果送到标準輸出(如顯示器)中。

-x language:強制編譯器用指定的語言編譯器來編譯某個源程式。

-o:在預設狀态下,在目前目錄生成一個名為a.out的可執行程式。

-static:強制程式連接配接靜态庫。

-L:特别指定所依賴庫所在的路徑。

 參考:GCC編譯工具集和nasm編譯器的簡要介紹_不#曾&輕聽的部落格-CSDN部落格_nasm編譯器

gcc編譯工具_Scorpio_L_的部落格-CSDN部落格