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 寄存器参考:https://blog.****.net/gujing001/article/details/8476685
mips指令简单入门:
https://blog.****.net/ben_chong/article/details/51794392
Link.ld 脚本详解
https://www.cnblogs.com/li-hao/p/4107964.html
http://blog.chinaunix.net/uid-27197466-id-4461055.html
https://segmentfault.com/a/1190000007103522?utm_source=tuicool&utm_medium=referral