Linux預處理、編譯、匯編、鏈接和運行的過程(包括一些基本的命令)


轉自Quinn0918的博客

一、預編譯

1.將所有的#define刪除,並展開所有的宏定義;
2.處理所有的預編譯指令,例如:#if,#elif,#else,#endif;
3.處理#include預編譯指令,將被包含的文件插入到預編譯指令的位置;
4.添加行號信息文件名信息,便於調試;
5.刪除所有的注釋:// /**/;
6.保留所有的#pragma編譯指令,因為在編寫程序的時候,我們經常要用到#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作。
7.生成.i文件。

包括(1)去注釋 (2)宏替換 (3)頭文件展開 (4)條件編譯

二、編譯:C語言—>匯編##

1.掃描,語法分析,語義分析,源代碼優化,目標代碼生成,目標代碼優化;
2.生成匯編代碼;
3.匯總符號;
4.生成.s文件

三、匯編:匯編—>二進制

1.根據匯編指令和特定平台,把匯編指令翻譯成二進制形式;
2.合並各個section,合並符號表;
3.生成.o文件

四、鏈接##

1.合並各個.obj文件的section,合並符號表,進行符號解析;
2.符號地址重定位;
3.生成可執行文件

程序示例##

main.cpp

#include <stdio.h>
int main()
{
    printf( "hello world" );
    return 0;
}

1.預處理###

gcc main.c -E -o main.i

表示讓gcc只進行“預處理”就行了。 所謂的預處理,就是把程序中的宏展開, 把頭文件的內容展開包含進來等等一些編譯前的預處理操作,然后-o保存在test.i里。

2.編譯###

 gcc -S main.i -o main.s

表示讓gcc只進行“預處理編譯”就行了。將test.i翻譯成文本文件test.s,它包含一個匯編語言程序。編譯會從詞法、語法和語義上對文件進行分析, 並進行匯編代碼生成, 形成的還是文本文件------匯編語言文件。以.s作為文件擴展名,然后-o保存在test.s里。

3.匯編###

 gcc -c main.s -o main.o

表示讓gcc只進行“預處理編譯匯編”就行了。匯編器將test.s翻譯成二進制機器語言指令,所以我們就看不懂了,把這些指令打包成一種叫做可重定位目標程序格式,並保存在.o文件中。

4.鏈接###

gcc main.o -o a

表示讓gcc只進行“預處理編譯匯編鏈接”。最后將二進制機器語言指令轉換成二進制的可執行程序。

5.運行###

 ./a


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM