链接脚本的语法
SECTIONS {
...
secname start BLOCK(align) (NOLOAD) : AT ( ldadr )
{ contents } >region :phdr =fill
...
}
解释:
secname :段名
start :起始地址:运行时的地址(runtime addr);重定位地址(relocate addr)
AT ( ldadr ) :可有可无(load addr:加载地址) 不写时LoadAddr = runtime addr
{ contents } 的内容:
start.o //内容为start.o文件
*(.text)所有的代码段文件
start.o *(.text)文件
elf文件格式
1 链接得到elf文件,含有地址信息(load addr)
2 使用加载器
:: 2.1 对于裸板是JTAG调试工具
:: 2.2 对于APP,加载器也是APP 把elf文件解析读入内存的加载地址
3 运行程序
4 如果loadaddr != runtimeaddr程序本身要重定位
核心程序运行时应该位于 runtimeaddr(reloate addr)或者链接地址
bin文件
1 elf生成bin文件
2 硬件机制启动
3 如果bin文件所在位置 不等于runtimeaddr ,程序本身实现重定位
bin文件/elf文件都不保存bss段 这些都是初始值为0 或者没有初始化的全局变量
程序运行时把bss段对应的空间清零
做个实验,把全局变量g_A以16进制打印出来
/* 0xABCDEF12 */
void printHex(unsigned int val)
{
int i;
unsigned char arr[8];
/* 先取出每一位的值 */
for (i = 0; i < 8; i++)
{
arr[i] = val & 0xf;
val >>= 4; /* arr[0] = 2, arr[1] = 1, arr[2] = 0xF */
}
/* 打印 */
puts("0x");
for (i = 7; i >=0; i--)
{
if (arr[i] >= 0 && arr[i] <= 9)
putchar(arr[i] + '0');
else if(arr[i] >= 0xA && arr[i] <= 0xF)
putchar(arr[i] - 0xA + 'A');
}
}
//打印初始值为0的变量
int g_A = 0;
int g_B;
int main(void)
{
uart0_init();
puts("nrg_A = ");
printHex(g_A);
puts("nr");
上述代码,没有清理bss段 g_A等于莫名奇妙的值 并不等于0 所以需要清理bss段
修改lds链接文件
SECTIONS {
.text 0 : { *(.text) }
.rodata : { *(.rodata) }
.data 0x30000000 : AT(0x700)
{
data_load_addr = LOADADDR(.data);
data_start = . ;
*(.data)
data_end = . ;
}
bss_start = .; //bss开始地址是当前位置
.bss : { *(.bss) *(.COMMON) }
bss_end = .; //bss结束地址也是当前位置
}
修改start.s,清除bss段
/* 清除BSS段 */
ldr r1, =bss_start
ldr r2, =bss_end
mov r3, #0
clean:
strb r3, [r1]
add r1, r1, #1
cmp r1, r2
bne clean
bl main
halt:
现在的代码全局变量就是为0,通过几行代码,就可以少几十个甚至上千个全局变量的存储空间。
上一篇:S3c2440代码重定位详解2---链接脚本的引入与简单测试
下一篇:S3c2440代码重定位详解4---拷贝代码和链接脚本的改进
推荐阅读最新更新时间:2024-11-04 10:46
设计资源 培训 开发板 精华推荐
- AND8227/D,使用NE570/SA571 Commander进行自动增益控制的应用电路
- LT3756EUD-2 90% 效率、20W SEPIC LED 驱动器的典型应用电路
- ADR5041A 2.5 Vout 精密微功率并联模式电压基准的典型应用
- SEC-PTC400-EVB:HVAC PTC IGBT 驱动器
- 根据 EN50121-3-2(双输出)使用带有 EMC 滤波的 RP40-4805SFR DC/DC 转换器的典型应用
- 具有主备用电池的 LTC3106IFE 太阳能电池输入的典型应用电路
- ADR292GRZ 4.096V便携式设备稳压器典型应用电路
- 基于混合信号控制处理器 (DSP) 的 ADZS-CM403F-EZLITE、ADSP-CM40x EZ-KIT Lite 评估系统
- JW5068A-同步整流降压模块
- MAXREFDES67#:通用输入微型PLC
- 科学家研发基于AI的身份验证工具 可保护车辆免受网络攻击威胁
- Microchip推出广泛的IGBT 7 功率器件组合,专为可持续发展、电动出行和数据中心应用而设计
- 面向未来驾驶体验 博世推出新型微电子技术
- 英飞凌与马瑞利合作 利用AURIX™ TC4x MCU系列推动区域控制单元创新
- 5C超充,该怎么卷?
- 《2025年度中国汽车十大技术趋势》正式揭晓!你最看好哪个?
- Microchip推出新型VelocityDRIVE™软件平台和车规级多千兆位以太网交换芯片,支持软件定义汽车
- 英特尔中国正式发布2023-2024企业社会责任报告
- can转485数据是如何对应的
- MCU今年的重点:NPU和64位
- 直播已结束|如何通过【TI MSPM0 固件示例】及【常用电机驱动器方案和拓扑】,在10分钟内旋转电机
- 了解设计完整AC-DC系统的快速低风险方法,轻松答题赢好礼
- 直播已结束|浅谈Microchip的FPGA产品与智能嵌入式视觉解决方案
- 点评《与Atmel SAM D21/R21的相遇、相识、相知(上)》,赢温暖新春礼
- 3月26日上午10:00直播:开拓IoT社会 尼吉康的新蓄电装置
- 【有奖问答】MOSFET,选型我在行!
- 泰克移动多媒体总线系列专题来袭~《HDMI2.0规范测试方案》下载有礼!
- 直播已结束|TI C2000 Piccolo 单芯片——实现双轴伺服电机和马达控制
- 国产FPGA安路科技研讨会-北京站 火热报名中,参会赢京东卡!
- 有奖直播|Nexperia针对车联网应用的高效ESD解决方案