Linux中程序的編譯和鏈接過程


1、從源碼到可執行程序的步驟:預編譯、編譯、鏈接、strip
預編譯:預編譯器執行。譬如C中的宏定義就是由預編譯器處理,注釋等也是由預編譯器處理的。
編譯: 編譯器來執行。把源碼.c .S編程機器碼.o文件。
鏈接: 鏈接器來執行。把.o文件中的各函數(段)按照一定規則(鏈接腳本來指定)累積在一起,
形成可執行文件。
strip: strip是把可執行程序中的符號信息給拿掉,以節省空間。(Debug版本和Release版本)
objcopy:由可執行程序生成可燒錄的鏡像bin文件。

2、程序段的概念:代碼段、數據段、bss段(ZI段)、自定義段
段就是程序的一部分,我們把整個程序的所有東西分成了一個一個的段,給每個段起個名字,然后在鏈接時就可以用這個名字來指示這些段。也就是說給段命名就是為了在鏈接腳本中用段名來讓段站在核實的位置。

段名分為2種:一種是編譯器鏈接器內部定好的,先天性的名字;一種是程序員自己指定的、自定義的段名。
先天性段名:
代碼段:(.text),又叫文本段,代碼段其實就是函數編譯后生成的東西
數據段:(.data),數據段就是C語言中有顯式初始化為非0的全局變量
bss段:(.bss),又叫ZI(zero initial)段,就是零初始化段,對應C語言中初始化為0的全局變量。
后天性段名:
段名由程序員自己定義,段的屬性和特征也由程序員自己定義。


免責聲明!

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



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