中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux編譯的過程中gcc -c命令做了什么操作

發布時間:2021-09-04 21:55:13 來源:億速云 閱讀:265 作者:chen 欄目:大數據

這篇文章主要介紹“linux編譯的過程中gcc -c命令做了什么操作”,在日常操作中,相信很多人在linux編譯的過程中gcc -c命令做了什么操作問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”linux編譯的過程中gcc -c命令做了什么操作”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

gcc -c hello.c 背后

#include<stdio.h>
int main()
{
  printf("Hello World\n");
  return 0;
}
gcc hello.c -o hello.o
./hello.o
Hello World
  • 上述過程可以分為四個部分:預處理、編譯、匯編和鏈接

  1. 預編譯和編譯處理程序:cc1

  2. 匯編器處理程序:as

  3. 鏈接器處理程序:ld

  • 預編譯(cc1)

  1. 刪除

  2. 展開

  3. 添加

  4. 保留

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)

靜態語言c/c++模塊之間通信的方式

模塊間的函數調用和模塊間的變量的訪問,函數訪問必須知道目標函數的地址,變量訪問也必須知道目標變量的地址,所以這兩種方式都可以歸結為同一種方式,那就是模塊間的符號的引用。模塊的拼接就引出了鏈接。 鏈接

  1. 目的:將各個模塊之間相互引用的部分都處理好,使得各個模塊之間能夠正確地銜接。

  2. 過程:鏈接過程分為兩步,第一步是合并所有目標文件的段,并調整段偏移和段長度,合并符號表,分配內存地址;第二步是鏈接的核心,進行符號的重定位

數據

  • 數據存放的區域有三個地方:.data段、.bss段和.text段。一般C語言的編譯后執行語句都編譯成機器代碼,保存在.text段;對于初始化不為0的全局變量和靜態變量存放在.data段;對于未初始化或者初始化值為0的段存放在.bss段中,而且不占目標文件的空間。

  1. 文本段:只讀、可共享、程序源代碼編譯后的機器指令、為防止堆棧溢出存放在堆或者堆棧的下方

  2. 初始化數據段:不是只讀,變量的值在運行時可以修改

  3. 未初始化數據段

  • 數據和指令分開的好處

  1. 防止指令被修改,數據段可讀寫,指令段只讀,被分別映射到不同的虛擬存儲區

  2. CPU的緩存被設計成數據緩存和指令緩存

  3. 文本段是可共享的,即可執行的指令是共享的,對于頻繁執行的程序只需要一個副本在內存中就可以了;而數據段卻是每個進程私有的;這樣做可以大量節省內存。

到此,關于“linux編譯的過程中gcc -c命令做了什么操作”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

同仁县| 湘阴县| 桦川县| 高雄市| 宁安市| 安塞县| 定陶县| 黄梅县| 新津县| 铜山县| 手游| 红河县| 丽水市| 临桂县| 休宁县| 新竹市| 龙游县| 宜昌市| 绥德县| 安平县| 苏尼特左旗| 永济市| 蛟河市| 屯留县| 疏勒县| 房产| 左贡县| 普安县| 临湘市| 内乡县| 襄垣县| 天全县| 蓬溪县| 潮安县| 高雄县| 社旗县| 嘉义县| 衢州市| 灌阳县| 海原县| 定陶县|