bounty将在20小时后到期。回答此问题可获得+100声望奖励。hellow正在寻找一个规范的答案:我想有一个答案,因为它影响到我。也许在这五年里,从评论到现在,有些事情已经改变了。
我正在修改现有的.ld
,我有两个flash部分的代码。这两个闪存部分是不连续的,所以我不能仅仅扩展其中一个部分的定义以包括另一个部分。
目前所有的代码都可以适应sec1
,但如果我关闭空间优化,它就不适合了。
问题
我如何写.ld
说地方尽可能多的代码将适合在sec1
,然后尽可能多的将适合在sec2
,然后... sec3
...等?
我知道如何将特定的.obj
放在特定的部分,但这不是我想要的,因为我需要随着代码的变化不断修改.ld
。
1条答案
按热度按时间uqcuzwp81#
若要根据可用空间在多个不连续的节之间分配代码,可以在链接器脚本(.ld文件)中使用动态内存分配策略。此方法允许链接器根据每个节中的剩余空间自动分配节。
下面是一个如何在链接器脚本中实现这一点的示例:
在本例中,您需要将
<sec1_origin>
、<sec1_length>
、<sec2_origin>
、<sec2_length>
等替换为每个部分的适当值。类似地,<start_address>
应该替换为所需的开始地址,以便放置节。链接器脚本使用
MEMORY
指令定义内存区域。每个部分都被分配了一个起始地址和长度。SECTIONS
指令指定节的位置。BLOCK
关键字用于在每个区段内分配内存块。这些部分将根据可用空间按您希望的填充顺序放置。在放置所需部分之后,定义虚拟部分(
dummy
)以填充sec1
中的剩余空间。这可以防止链接器在该空间中放置任何其他代码。最后,定义符号(
__sec1_start
、__sec1_end
等)来表示每个部分的开始和结束地址。这些符号可在代码中用于引用已分配节的边界。通过在链接器脚本中使用这种动态分配策略,您将不需要在每次代码更改时修改脚本。链接器将在链接过程中根据可用空间自动分配节。