1. .text段是**段,比如main程式就存放在這裡; .data段存放已初始化的資料而且初始化不為0;.bss段存放未初始化或初始化為0的資料(英文含義:以符號開始的塊),在這裡我們引發出幾個問題:
(1)我們都知道.bss段不佔空間,它到底不佔**的空間? 虛擬位址空間還是檔案空間?
答案是檔案空間,因為對於.bss段來說,分配空間的意義只侷限於虛擬位址空間,因為它在檔案中並沒有內容。而在僅生成.o檔案時,.bss是不佔.o檔案空間的,在以後的鏈結過程中,鏈結器會為目標檔案分配虛擬位址和空間。
(2).c到.exe過程中有多少個檔案產生?為什麼?(有解決待)
2.程式從編寫到執行經過哪些過程?
一、預編譯 生成.i檔案(windows下)
(1)展開標頭檔案 (2)替換#define (3)刪除注釋 (4)新增行號 (5)保留#pragma (6)刪除巨集:#if #endif等
二、編譯 生成.s檔案
詞法分析,語法分析,語義分析,**優化等
三、彙編生成.o檔案,也就是目標檔案
將**彙編成機器指令
四、鏈結生成.exe檔案
(1)符號解析 (2)符號重定位 (3)分配位址空間
3.目標檔案和可執行檔案都是elf格式的檔案(linux下)
4..bss段少了哪個變數?為什麼會少了這個變數?
答案是未初始化的 全域性變數,它也是一種弱符號,所以所佔空間大小未知,因為有可能其它編譯單元中該符號所佔的空間比本編譯單元該符號所佔的空間大,(比如char *str = ...我們並不知道),所以編譯器此時無法為該弱符號在bss段分配空間,我們將它標記為common型別的變數。
5.怎麼知道.bss段的資訊?
elf頭段裡有.bss段的資訊
6.在區域性變數未初始化時,位址是0xcccccccc,原因是訪問了核心空間,它是無效值
7.強符號:已初始化的全域性變數;弱符號:未初始化的全域性變數
8.c語言中強弱符號規則:
兩個強符號,報錯;一強一弱,取強符號;兩個弱符號,由編譯器決定
強弱符號是有針對性的。
9.若定義char *p = "hello world";
hello world儲存在唯讀資料段.rodata
10.標頭檔案裡放的是宣告
11.main引數:int main(int argc,char **argv,char **envp)
12.linux : user space:3g knel space:1g
windows 3 1
2 2
13.zone_dma 大概16m 不經過暫存器
zone_namal 常用部分 16~896m
zone_highmen 896m~結束
目標檔案裡有什麼?
目標檔案從結構上講,它是已編譯後的可執行檔案格式 windows的.obj或linux的.o 只是還沒有經過鏈結的過程。它跟可執行檔案的內容和結構很類似,所以一般跟可執行檔案格式一起採用一種格式儲存。無論是linux下的elf executable linkable format 或windows下...
目標檔案裡有什麼 揭秘目標檔案
程式源 被編譯後生成的機器指令被放在 段 text 全域性變數和區域性靜態變數被放在資料段 data 除此之外還有程式裡邊的唯讀變數 如const修飾的變數 和字串常量被分配在唯讀資料段 rodata 注釋資訊段 comment 堆疊提示段 nute.gnu stack 未初始化的全域性變數和靜態區...
知識積累 目標檔案裡有什麼(1)
程式源 被編譯後主要分成兩種段 程式指令和程式資料,屬於程式指令,而資料段和.bss屬於程式資料。為什麼程式指令和資料不混在在一起而是分開放?1.因為程式被裝載後,資料和指令分別被對映到兩個虛存區域。由於資料區域對於程序來說是可讀寫的。而指令區域對於程序來說是可讀的。所以這兩個虛存區域的許可權可以分...