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是程式中的已初始化變數...