S32DS中.ld(链接)文件学习

一、.ld文件作用

程序代码(.s 和 .c)源文件会经过预编译、编译、汇编、链接最后生成目标可执行文件,.ld文件是作用在链接过程。

链接的作用是:

  1. 合并各个.obj文件的section,合并符号表,进行符号解析;

  1. 符号地址重定位;

  1. 生成可执行文件。

linker_flash.ld:Flash和SRAM内存分配,为Flash构建目标分配代码段和数据段;

linker_ram.ld:SRAM内存分配,为RAM构建目标分配代码段和数据段。

可以利用.ld文件将函数和变量放置到自定义的地址中。

二、文件讲解

1.常用关键词介绍

ENTRY命令:运行一个程序时第一个被执行到的指令的"入口点"。

MEMORY命令:内存块配置命令,一个连接脚本最多一个’MEMORY’命令。

SECTIONS命令:’段’命令,段中又包含多个’节’, SECTIONS命令告诉连接器如何把输入节映射到输出节, 如何把输入节放入到内存中。

KEEP()命令:防止垃圾收集机制把这个节排除在外,同时保证向量表在段中的位置处于最顶端。

ALTGN命令:以多少位对齐,例如ALTGN(4)表示以4位对齐。

.命令:一个点“.”可以用来获取当前内存地址。

*:‘’是一个通配符,可以与所有文件名匹配。例如表达式(.text)表示所有输入文件的.text输入段。

2..ld文件解析

按照常用关键词去解析.ld文件内容即可。

三、指定地址操作

:无法直接将变量或函数直接存到绝对地址(指定地址语法见下),如:

__attribute__ ((at (0x10000000))) uint32_t value = 0x01;

会出现此警告:

表示‘at’后面的指定地址方式不支持,因此忽略掉了。

指定变量地址支持的语法语法:

__attribute__ ((section (".SectionName"))) uint32_t value=0x01;

因此需要自定义一个节用来存放变量或函数。

1.指定地址语法

1)将变量存放指定地址的语法(例如将变量‘uint32_t value’存放到‘standby_ram_data’节中):

__attribute__ ((section (".standby_ram_data"))) uint32_t value=0x01;

编译后.map文件:

2)将函数存放指定地址的语法(例如将函数‘main’存放到‘abcd’节中):

编译后.map文件:

2.自定义节

在linker_flash.ld文件中将int_sram拆分出一段并命名为standby_sram:

在sections{}中编写新的节

编译后在.map文件中能够看到自定义的节:

3.操作演示

在main.c文件中定义变量:

uint32_t value0 = 0x01;
uint32_t value1 = 0x02;
uint32_t zero0 = 0;
uint32_t zero1 = 1;

将初始值不为‘0’的变量放入‘standby_ram_data’节,初始值为‘0’的变量放入‘standby_ram_bss’节。

编译后.map文件:

在maun.c文件中定义函数:

int fun0(void)
{
    return (0U);
}
int fun1(void)
{
    return (0U);
}

将‘main()’、‘fun0()’、‘fun1()’放入‘abcd’节。

编译后.map文件:

  • 15
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

studyingdda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值