您好,登錄后才能下訂單哦!
這篇文章主要介紹“linux編譯的過程中gcc -c命令做了什么操作”,在日常操作中,相信很多人在linux編譯的過程中gcc -c命令做了什么操作問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”linux編譯的過程中gcc -c命令做了什么操作”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
#include<stdio.h> int main() { printf("Hello World\n"); return 0; } gcc hello.c -o hello.o ./hello.o Hello World
上述過程可以分為四個部分:預處理、編譯、匯編和鏈接
預編譯和編譯處理程序:cc1
匯編器處理程序:as
鏈接器處理程序:ld
預編譯(cc1)
刪除
展開
添加
保留
gcc -E hello.c -o hello.i
編譯(cc1) gcc -S hello.c -o hello.s
匯編(as) gcc -c hello.s -o hello.o 或者as hello.s -o hello.o
鏈接(ld)
模塊間的函數調用和模塊間的變量的訪問,函數訪問必須知道目標函數的地址,變量訪問也必須知道目標變量的地址,所以這兩種方式都可以歸結為同一種方式,那就是模塊間的符號的引用。模塊的拼接就引出了鏈接。 鏈接
目的:將各個模塊之間相互引用的部分都處理好,使得各個模塊之間能夠正確地銜接。
過程:鏈接過程分為兩步,第一步是合并所有目標文件的段,并調整段偏移和段長度,合并符號表,分配內存地址;第二步是鏈接的核心,進行符號的重定位
數據存放的區域有三個地方:.data段、.bss段和.text段。一般C語言的編譯后執行語句都編譯成機器代碼,保存在.text段;對于初始化不為0的全局變量和靜態變量存放在.data段;對于未初始化或者初始化值為0的段存放在.bss段中,而且不占目標文件的空間。
文本段:只讀、可共享、程序源代碼編譯后的機器指令、為防止堆棧溢出存放在堆或者堆棧的下方
初始化數據段:不是只讀,變量的值在運行時可以修改
未初始化數據段
數據和指令分開的好處
防止指令被修改,數據段可讀寫,指令段只讀,被分別映射到不同的虛擬存儲區
CPU的緩存被設計成數據緩存和指令緩存
文本段是可共享的,即可執行的指令是共享的,對于頻繁執行的程序只需要一個副本在內存中就可以了;而數據段卻是每個進程私有的;這樣做可以大量節省內存。
到此,關于“linux編譯的過程中gcc -c命令做了什么操作”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。