分类: LINUX
2014-09-28 15:06:09
版本:boardàar7420àap93
首先弄清楚这些表示的意思:(linux链接脚本中一些基本的数据定义)
. è当前值
.text è代码段
.rodata è只读数据段
.data è全局数据段
.sdata è小规模数据段
.got è全局偏移表(global offset table) 自定义段
.sbss è存放小规模的通用目标
.bss è存放程序中未初始化的全局变量,在初始化时一般清零(属于静态内存分配)
(Block Started by Symbol segment)
源码如下:(路径:/mnt/disk/ap93/boot/u-boot/board/ar7420/ap93/u-boot.lds)
OUTPUT_FORMAT(“elf32-tradbigmips”,”elf32-tradbigmips”,”elf32-tradbigmips”)
/*指定输出可执行文件是elf格式,32位mips指令,大端*/
OUTPUT_ARCH(mips)
/*指定输出文件的平台体系是mips*/
ENTRY(_start)
/*指定可执行映像文件的起始段的段名是_start ,系统上电后在start.S文件中从_start标号开始执行*/
SECTIONS
{
/*指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。
必须使编译器知道这个地址,通常都是修改此处来完成*/
. = 0X00000000; /*起始地址为0X00000000*/
. = ALIGN(4); /*字对齐,即就是4字节对齐*/
.text : /*代码段 (代表一个输出节,具体查看lds文件规则.txt)*/
{
*(.text) /*所有的输入文件,其中“*”表示通配符*/
}
. = ALIGN(4);
.rodata : {*(.rodata)} /*只读数据段,所有的只读数据段都会放在这个位置*/
. = ALIGN(4);
.data : {*(.data)} /*可读写数据段,所有的可读写数据段都放在这里*/
. = ALIGN(4);
.sdata : {*(.sdata)} /*用来保存小规模数据的数据段*/
_gp = ALIGN(16);
__got_start = .; //自定义段
.got : {*(.got)}
__got_end = .;
.sdata : {*(.sdata)} /*用来保存小规模数据的数据段*/
__u_boot_cmd_start = .;
.u_boot_cmd : {*(.u_boot_cmd)} /*存放所有的uboot命令*/
__u_boot_cmd_end = .;
Uboot_end_data = .;
Num_got_entries = (__got_end - __got_start) >> 2;
. = ALIGN(4);
.sbss : {*(.sbss)} //存放小规模通用目标
.bss : {*(.bss)} //存放程序中未初始化的全局变量
Uboot_end = .;
}
这段代码的作用è起到了代码和数据怎么规划怎么摆放的作用(个人理解)
附图:(来自网上)
(可能根据开发板的不同有点不同吧,但最基本还是一样。基本上都这样吧。)