【问题标题】:Excluding RAM addresses in LD (GNU linker)排除 LD 中的 RAM 地址(GNU 链接器)
【发布时间】:2023-03-12 00:40:02
【问题描述】:

在基于 ARM 的 EVB 上工作时,我偶然发现了一个有缺陷的内存位置。在新的 EVB 到来之前:

告诉 LD 排除特定 RAM 地址或地址范围的最简单方法是什么?具体来说,如何修改链接脚本来实现呢?

【问题讨论】:

  • 修改ld使用的链接脚本?
  • 必须有一个扩展名为*.ld的文件,您必须在该文件的SECTIONS中编辑地址范围。据我所知,链接器脚本文件中的地址范围。
  • “最简单”的方法可能是有目的地放置一个您从不使用的缓冲区(假设您的工具链支持at()__attribute__。(并且您的硬件在编写坏 ram,因为它将被初始化为零)。但是,正确的方法是从 .ld 文件中的地图中删除它
  • 它不必有扩展名 .ld 但会有一个 SECTIONS 条目,所以你可以 grep 。如果没有看到您的链接描述文件,实际上不可能告诉您要更改什么。是的,链接器脚本可以用于此目的,但因为在该语言(gnu ld 链接器脚本)中有不同的方法可以做到这一点,所以没有一个通用的答案,甚至可能没有一个针对您的特定脚本的答案。
  • MEMORY 区域或 SECTIONS 区域或两者的组合都可以定义有效范围的位置,如果您试图避免一个地址或漏洞,这可能会变得很棘手,因为链接器确实想要将所有 .text 放在一起,将所有 .data 放在一起(和其他)作为默认设置,因此您必须开始按名称定义对象。我会以其他方式解决这个问题,获得另一个评估板或使用其他基于手动调整的技巧,而不是这种极端。

标签: gcc embedded ld


【解决方案1】:

您可以在此位置创建一些未使用的变量,而不是修改 .ld 脚本。并非所有编译器都支持这一点,这里有示例:http://www.keil.com/support/docs/2829.htm。您只需要确保未优化此变量或禁用链接优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2019-04-26
    • 2012-12-28
    • 2018-08-12
    • 2015-07-28
    • 2010-10-10
    • 2017-08-31
    相关资源
    最近更新 更多