程序编译连接原理
main.c–>main需要四步:預處理,編譯,匯編,連接
1.預編譯階段:gcc -E main.c -o main.i
預編譯階段主要做六件事:
(1) 刪除所有的“#define”,并且展開所有的宏定義;
(2) 處理所有的條件預編譯指令,“#if”、“#ifdef”、“#endif”等;
(3) 處理“#include”預編譯指令,將被包含的文件插入到該預編譯指令的位置;
(4) 刪除所有的注釋;
(5) 添加行號和文件名標識,以便于編譯器產生調試用的符號信息及編譯時產生編譯錯誤和警告時顯示行號;
(6) 保留所有的#pragma 編譯器指令,因為編譯器需要使用它們。
預編譯階段的語言還屬于高級語言,計算機不能理解.
2.編譯階段:gcc -S main.i -o main.s
編譯階段主要有五件事:
(1) 進行詞法分析;
(2) 語法分析;
(3) 語義分析;
(4) 代碼優化;
(5) 生成匯編指令
編譯階段的語言屬于低級語言.
3.匯編階段:gcc -c main.s -o main.o
匯編階段主要是翻譯指令(即將低級語言翻譯成機器語言).
4.鏈接階段:gcc -o main.o main
鏈接階段主要做匯編階段未做的事情:
(1) 強弱符號的處理;
(2) 外部符號的處理;
(3) 指令段中虛假地址和虛假偏移的處理;
(4) 符號的重定位.
補充:
<stdio.h>里面放的是申明;
Windows中的可執行文件的格式是PE格式;
Linux中可執行文件的格式是ELF格式.
總結
- 上一篇: 快速排序的三种实现方法
- 下一篇: 智能指针——auto_ptr