完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以下是我学习u-boot的链接脚本时做的笔记,欢迎指正错误。
/* 指明输出的可执行文件格式为elf,即小端模式的32位ARM指令 */ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /* 输出的可执行文件的平台为ARM */ OUTPUT_ARCH(arm) /* 将符号_start表示的地址设置为入口地址,也就是起始代码段为_start */ ENTRY(_start) SECtiONS /* 程序各个段的具体的地址分配 */ { . = 0x00000000; /* ROM起始地址 */ . = ALIGN(4); /* 代码以4字节对齐 */ .text : { cpu/s3c64xx/start.o (.text) /* start.o代码部分 */ cpu/s3c64xx/s3c6410/cpu_init.o (.text) /* cpu_init.o代码部分 */ cpu/s3c64xx/onenand_cp.o (.text) cpu/s3c64xx/nand_cp.o (.text) cpu/s3c64xx/movi.o (.text) *(.text) /* 其他代码部分 */ lib_arm/div0.o /* div0.o代码部分 */ } . = ALIGN(4); /* 4字节对齐 */ .rodata : { *(.rodata) } /* 指定只读数据段 */ . = ALIGN(4); /* 4字节对齐 */ .data : { *(.data) } /* 指定读写数据段( RAM ) */ . = ALIGN(4); .got : { *(.got) } /* 指定got段, got段式是uboot自定义的一个段, 非标准段 */ __u_boot_cmd_start = .; //把__u_boot_cmd_start赋值为当前位置, 即起始位置*/ .u_boot_cmd : { *(.u_boot_cmd) } //指定u_boot_cmd段, uboot把所有的uboot命令放在该段.*/ __u_boot_cmd_end = .; //把__u_boot_cmd_end赋值为当前位置,即结束位置*/ . = ALIGN(4); .mmudata : { *(.mmudata) } . = ALIGN(4); __bss_start = .; //把__bss_start赋值为当前位置,即bss段的开始位置*/ .bss : { *(.bss) } //指定bss段*/ _end = .; //把_end赋值为当前位置,即bss段的结束位置*/ } 总体上的代码地址分配清晰了,熟悉了链接脚本后,可以知道各个代码链接时是按照什么顺序存放的,也能自定义代码段的地址,从而有效规划程序的存放地址,例如,uboot就将存放命令行指令的代码统一放到了u_boot_cmd这个段里了,而且编译的时候能计算出该段的长度,从而在搜索指令的时候就在__u_boot_cmd_start 和 __u_boot_cmd_end 之间按照指令的结构体格式进行遍历即可。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
5074 浏览 0 评论
87644 浏览 0 评论
【高手问答】如何做到精通linux威廉希尔官方网站 ?资深工程师带你突破难点
5040 浏览 2 评论
3827 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2632 浏览 0 评论
1790浏览 1评论
2196浏览 0评论
SiRider S1芯擎工业开发板测评+1.防止黑客入侵通信监控系统(PSA)
1177浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-7-12 10:54 , Processed in 1.233258 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191