c++ GNU链接器脚本-如何自动将代码分发到多个不连续的部分

dauxcl2d  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(217)

bounty将在20小时后到期。回答此问题可获得+100声望奖励。hellow正在寻找一个规范的答案:我想有一个答案,因为它影响到我。也许在这五年里,从评论到现在,有些事情已经改变了。

我正在修改现有的.ld,我有两个flash部分的代码。这两个闪存部分是不连续的,所以我不能仅仅扩展其中一个部分的定义以包括另一个部分。
目前所有的代码都可以适应sec1,但如果我关闭空间优化,它就不适合了。

问题

我如何写.ld地方尽可能多的代码将适合在sec1,然后尽可能多的将适合在sec2,然后... sec3 ...等
我知道如何将特定的.obj放在特定的部分,但这不是我想要的,因为我需要随着代码的变化不断修改.ld

uqcuzwp8

uqcuzwp81#

若要根据可用空间在多个不连续的节之间分配代码,可以在链接器脚本(.ld文件)中使用动态内存分配策略。此方法允许链接器根据每个节中的剩余空间自动分配节。
下面是一个如何在链接器脚本中实现这一点的示例:

  1. /* Define the memory regions */
  2. MEMORY {
  3. sec1 : ORIGIN = <sec1_origin>, LENGTH = <sec1_length>
  4. sec2 : ORIGIN = <sec2_origin>, LENGTH = <sec2_length>
  5. sec3 : ORIGIN = <sec3_origin>, LENGTH = <sec3_length>
  6. /* ... add more sections as needed ... */
  7. }
  8. /* Define the sections */
  9. SECTIONS {
  10. . = <start_address>; /* Set the initial address for section placement */
  11. /* Place the sections in order based on available space */
  12. sec1_start = .;
  13. .sec1 BLOCK(<sec1_length>) : {} > sec1
  14. sec1_end = .;
  15. sec2_start = .;
  16. .sec2 BLOCK(<sec2_length>) : {} > sec2
  17. sec2_end = .;
  18. sec3_start = .;
  19. .sec3 BLOCK(<sec3_length>) : {} > sec3
  20. sec3_end = .;
  21. /* ... add more sections as needed ... */
  22. /* Fill remaining space with a dummy section */
  23. .dummy BLOCK(<remaining_length>) : {} > sec1
  24. /* Define symbols for section boundaries */
  25. __sec1_start = sec1_start;
  26. __sec1_end = sec1_end;
  27. __sec2_start = sec2_start;
  28. __sec2_end = sec2_end;
  29. __sec3_start = sec3_start;
  30. __sec3_end = sec3_end;
  31. /* ... define symbols for other section boundaries ... */
  32. }

在本例中,您需要将<sec1_origin><sec1_length><sec2_origin><sec2_length>等替换为每个部分的适当值。类似地,<start_address>应该替换为所需的开始地址,以便放置节。
链接器脚本使用MEMORY指令定义内存区域。每个部分都被分配了一个起始地址和长度。
SECTIONS指令指定节的位置。BLOCK关键字用于在每个区段内分配内存块。这些部分将根据可用空间按您希望的填充顺序放置。
在放置所需部分之后,定义虚拟部分(dummy)以填充sec1中的剩余空间。这可以防止链接器在该空间中放置任何其他代码。
最后,定义符号(__sec1_start__sec1_end等)来表示每个部分的开始和结束地址。这些符号可在代码中用于引用已分配节的边界。
通过在链接器脚本中使用这种动态分配策略,您将不需要在每次代码更改时修改脚本。链接器将在链接过程中根据可用空间自动分配节。

展开查看全部

相关问题