欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

<三>從編譯器角度理解C++代碼編譯和鏈接原理

1代碼

創(chuàng)新互聯(lián)建站專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、昆玉網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價格優(yōu)惠性價比高,為昆玉等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

點(diǎn)擊查看代碼
**sum.cpp**
int gdata=10;
int sum(int a,int b){
  return a+b;
}

**main.cpp**

extern int gdata;
int sum(int , int );
int data=20;
int main(){
    int a =gdata;
    int b=data;
    int ret=sum(a,b);
    return 0;
}

1:編譯

需要關(guān)注的幾個點(diǎn)
1: .o 文件的格式組成是什么樣子?
2: .exe 文件的組成格式是什么樣子?
3: "所有.o文件段的合并 符號表合并后,進(jìn)行符號解析"
4: "符號的重定位(重定向)"
5: "符號表的輸出"=> "符號"
6: 符號什么時候分配虛擬地址?

預(yù)編譯
以#開頭的命令

除#pragma lib -> 鏈接階段處理
除#pragma link -> 鏈接階段處理

編譯
語法分析,語義分析,代碼優(yōu)化 gcc g++

編譯后生成相應(yīng)平臺的 匯編代碼 X86 和 AT&T

鏈接
鏈接所有 .o文件和 靜態(tài)庫文件

.o 文件 主要是由以下組成
elf 文件頭
.text
.data
.bss
.symbal
.section table
....

符號表中,在自己文件中定義的,那就是符號定義,如果是引用外部的就 是 "UND"符號引用
符號表中的符號 都沒有分配地址,如下圖,所以編譯過程中,符號是不分配虛擬地址的,是在鏈接的時候分配

經(jīng)過了上面的 預(yù)編譯-》編譯-》匯編 各個階段后 下面開始進(jìn)入了 鏈接階段

main.o 文件 sum.o 文件
上面我們看到 .o 文件是由各個段組成的,所以進(jìn)入鏈接階段的時候
第一步 將各個.o 文件 的各個段合并

main.o 文件的 .text段 與 sum.o 文件的 .text 段合并
main.o 文件的 .data段 與 sum.o 文件的 .data 段合并
main.o 文件的 .bss段 與 sum.o 文件的 .bss 段合并
main.o 文件的 符號表 與 sum.o 文件的符號表 段合并

第二步 非常重要的一點(diǎn)是 在main.o文件的符號表與sum.o文件的符號表段合并的時候,需要進(jìn)行符號解析。
什么是"符號解析"?
所有對符號的引用,都要找到該符號定義的地方 “符號的引用” 即符號為 UND形式, 要找到該符號定義的地方即要找到該符號是在.text 段中定義還是在.data段中定義,
例如:鏈接器發(fā)現(xiàn)main.o文件的sum函數(shù)和gdata是UND形式的,那么鏈接器會去其他文件中找到sum和gdata的定義,如果沒找到,那么鏈接器報(bào)錯"符號未定義",
如果鏈接器找到了多個,那么鏈接器也會報(bào)錯 “符號重定義”,所以在整個工程中,全局的名字是不能重名的,否則會產(chǎn)生沖突.

符號解析成功以后 就開始回給所有的符號分配地址

第三步 "符號重定向"
在符號解析成功以后并且給所有的符號分配地址后,需要繼續(xù)做 "符號重定向"
在我們指令編譯匯編生成.O文件的時候,生成的指令中的符號的地址都是用0 代理,如下圖

現(xiàn)在我們需要將給符號分配好的地址 將指令中的這些0地址重新修正

現(xiàn)在我看下鏈接后的情況
符號表情況

指令情況

所以現(xiàn)在我們知道 “符號是在什么時候分配地址”, 在鏈接第一階段 符號解析成功后

可執(zhí)行文件 a.out 和 .O文件的組成方式很像,但是還是有一點(diǎn)區(qū)別

在a.out 可執(zhí)行文件中 增加了 “program headers” , a.out 文件中不是 所有的內(nèi)容都會加載到內(nèi)存中的,這個
"program headers"中指定了需要加載哪些到內(nèi)存中

上圖中的 有兩個load 就是需要加載到內(nèi)存中的.


下面我們再看看可執(zhí)行程序加載到內(nèi)存過程

網(wǎng)頁名稱:<三>從編譯器角度理解C++代碼編譯和鏈接原理
文章位置:http://chinadenli.net/article16/dsoiidg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司定制網(wǎng)站、網(wǎng)站排名、網(wǎng)站內(nèi)鏈、小程序開發(fā)、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)