1. 程式人生 > >Link.ld 連結指令碼記憶體解析

Link.ld 連結指令碼記憶體解析

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

unsigned int  bss_test_array[1024 * 1024];

unsigned int  bss_test_char = 0;

unsigned int  data_test_array[10] = {0,1,2,3,4,5,6,7,8,9};

unsigned int  data_test_char = 0xFF;

const unsigned int rodata_test_array[5] = {0,1,2,3,4};

int main(int argc,char *argv[])

{

  int bss_size = sizeof(bss_test_array);

  printf("I am Chinese!");

  return 0;

}

1.未初始化的全域性變數(.bss段)

bss段用來存放 沒有被初始化已經被初始化為0 的全域性變數。如下例程式碼:

unsigned int  bss_test_array[1024*1024];

unsigned int  bss_test_char = 0;

2. 已被初始化為非零的全域性變數(.data段)

unsigned int  data_test_array[10] = {0,1,2,3,4,5,6,7,8,9};

unsigned int  data_test_char = 0xFF;

3.常量資料(.rodata段)

 1)rodata用來存放常量資料。 ro: read only;

 2)字串會被編譯器自動放在rodata中,加 const 關鍵字的常量資料會被放在 rodata 中;如:

const unsigned int rodata_test_array[5] = {0,1,2,3,4};

printf(“I an Chinese”);

4.程式碼(.text段)

  text段存放程式碼(如:函式)和部分整數常量(應該指的是一些立即數),這個段是可執行的。

5.棧(stack)

  1)stack 存放函式的區域性變數和函式引數

  2)被呼叫函式的引數和返回值 被儲存到當前程式的棧區,之後被呼叫函式再為自身的自動變數和臨時變數在棧區上分配空間

  3)函式返回時,棧區的資料會被釋放掉,先入後出(FILO)的順序。

6.堆(heap)

heap用來動態分配記憶體,由程式自身決定開闢和釋放。

7.smll data初始化段

.sdata是指smll data初始化段(小於多少可以算small data,可以在codewarrior中設定)用於存放“近”資料,即使用短指標(near)定址的資料。有利於小的物件組合到單個可以直接定址的區域;

8.small data未初始化段
.sbss 是指small data未初始化段。

系統設定棧指標,以MIPS為列,在bootup.S中呼叫

La sp,_stack_top_addr;  $sp堆疊指標(Stack Pointer)

La gp,_gp_top_addr;   $gp(全域性指標(Global Pointer)

mips指令簡單入門:

Link.ld 指令碼詳解