gcc命令基本操作
gcc命令基本操作
- Hello基本操作
- 編譯
- 匯編
- 鏈接
- ELF文件分析
- 反匯編ELF
- gcc命令基本操作
- 簡單編譯
- 多個程序文件的編譯
- 總結
Hello基本操作
準備工作
#include <stdio.h> //此程序很簡單,僅僅打印一個 Hello World 的字符串。 int main(void) { printf("Hello World! \n"); return 0; }
預處理基本操作
hello.i文件
編譯
將預處理生成的 hello.i 文件編譯生成匯編程序 hello.s
匯編
匯編過程調用對匯編代碼進行處理,生成處理器能識別的指令,保存在后綴為.o 的目標文件中。
將編譯生成的 hello.s 文件匯編生成目標文件 hello.o
GCC 的選項-c 使 GCC 在執行完匯編后停止,生成目標文件
鏈接
靜態鏈接:
靜態鏈接是指在編譯階段直接把靜態庫加入到可執行文件中去,這樣可執行 文件會比較大。
text鏈接靜態庫,代碼尺寸變得極大
沒有鏈接動態庫
動態鏈接:
動態鏈接則是指鏈接階段僅僅只加入一些描述信息,而程序執行時再從系統 中把相應動態庫加載到內存中去。
gcc hello.c -o hello
鏈接了許多其他的動態庫,主要是linux系統glibc 動態庫
ELF文件分析
鏈接器鏈接后生成的最終文件為 ELF 格式可執行文件,一個 ELF 可執行文件通常 被鏈接為不同的段,常見的段譬如.text、.data、.rodata、.bss 等段
.text:已編譯程序的指令代碼段。
.rodata:ro 代表 read only,即只讀數據(譬如常數 const)。
.data:已初始化的 C 程序全局變量和靜態局部變量。
.bss:未初始化的 C 程序全局變量和靜態局部變量。
.debug:調試符號表,調試器用此段的信息幫助調試。
反匯編ELF
由于 ELF 文件無法被當做普通文本文件打開,如果希望直接查看一個 ELF 文件包 含的指令和數據,需要使用反匯編的方法
使用 objdump -S 將其反匯編并且將其 C 語言源代碼混合顯示出來:
gcc命令基本操作
簡單編譯
gcc -E test.c -o test.i 或 gcc -E test.c
gcc 的-E 選項,可以讓編譯器在預處理后停止,并輸出預處理結果
gcc -S test.i -o test.s
gcc 的-S 選項,表示在程序編譯期間,在生成匯編代碼后,停止,-o 輸出匯編代碼文件。
gcc -c test.s -o test.o
gcc 連接器是 gas 提供的,負責將程序的目標文件與所需的所有附加的目標文件連接起來,最終生 成可執行文件。附加的目標文件包括靜態連接庫和動態連接庫。
gcc test.o -o test
多個程序文件的編譯
gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test
a. gcc -pedantic illcode.c -o illcode
-pedantic 選項能夠幫助程序員發現一些不符合 ANSI/ISO C 標準的代碼,但不是全部,事實上只有 ANSI/ISO C 語言標準中要求進行編譯器診斷的 那些情況,才有可能被 GCC 發現并提出警告
b. gcc -Wall illcode.c -o illcode
使用它能夠使 GCC 產生盡可能多的警告信息
總結
靜態庫鏈接時搜索路徑順序:
動態鏈接時、執行時搜索路徑順序:
總結
- 上一篇: 镜头桶形失真校正算法
- 下一篇: IP175G调试总结