程式的各個段

2022-03-27 12:50:19 字數 2574 閱讀 7019

section 結構

sections >region :phdr =fill

...}

secname:段名

contents:決定哪些內容存放在此段

start:本段的連線位址(實際執行位址)

at(ldadr):儲存位址(載入的位址)

//例子u-boot.lds**(根據上面的section的介紹,雖能大體看懂,但是還是有些許疑惑)

sections

. = align(4);                    //以下類似

.rodata :

. = align(4);

.data :

. = align(4);

.got :

. = .;

__u_boot_cmd_start = .;

.u_boot_cmd :

__u_boot_cmd_end = .;

. = align(4);

__bss_start = .;

.bss :

_end = .;

}問題1,二進位制檔案不包含bss段,那把bss段放在哪 

答:修改有1000個全域性變數,難道要bin裡要存1000個0嗎?在鏈結指令碼裡把bss段組織在一起,記下它的起始位址、結束位址,重定位後把這塊記憶體清0即可

問題2:全域性變數不初始化的話預設初始化為零,幹嘛還要手動清零 

答:因為它是在bss段的

bss段:

bss段(bsssegment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文blockstarted by symbol的簡稱。bss段屬於靜態記憶體分配。

data段:

資料段(datasegment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。

text段:

**段(codesegment/textsegment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀,某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。

rodata段:

存放c中的字串和#define定義的常量

heap堆:

堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

stack棧:

是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

常量段:

常量段一般包含編譯器產生的資料(與唯讀段包含使用者定義的唯讀資料不同)。比如說由乙個語句a=2+3編譯器把2+3編譯期就算出5,存成常量5在常量段中

C語言的各個段。

c語言程式經過編譯連線後形成的二進位制映像檔案由棧,堆,資料段和 段組成。其中資料段 由三部分部分組成 唯讀資料段,已經初始化讀寫資料段,未初始化資料段即bbs 1.棧區 stack 又叫堆疊,先進先出,由編譯器自動分配釋放,存放函式的引數值,區域性變數等值。其操作方式類似於資料結構中的棧。2.堆區...

通過CCID獲得各個段的描述的方法

gl code combination 是存放會計科目組合的鍵彈性域的表單。該表單中沒有欄位的描述,乙個段乙個段的加描述太麻煩了。我通常都是通過以下的方法來獲得描述 sql 語句上 select gl flexfields pkg.get description sql char of accoun...

ARM程式的RO段 RW段和ZI段 Image

limit 含義 了解ro,rw和zi需要首先了解以下知識 arm程式的組成 此處所說的 arm程式 是指在arm系統中正在執行的程式,而非儲存在rom中的bin映像 image 檔案,這一點清注意區別。乙個arm程式包含3部分 ro,rw和zi ro是程式中的指令和常量 rw是程式中的已初始化變數...