【问题标题】:How to place a symbol at certain address via the linker script?如何通过链接描述文件将符号放置在某个地址?
【发布时间】:2016-11-09 10:23:10
【问题描述】:

这是关于 GNU 链接器的。

我有一个(假设是)变量名为myVar。现在我希望我的变量被放置在内存中的某个地址。

我使用的编译器有一个 __attribute__ ((blablabla)) 可以解决问题。但是我决定使用链接器脚本。

从现在开始,我设法将变量放在链接描述文件中的某个地址,就像这样:

myVar  = 0xDEAD;

它确实有效。问题是链接器很愚蠢,偶尔会在我的地址上部署其他变量。两者在某种程度上都像是在union 中。

我认为我需要以某种方式告诉链接器这个长度的地址已被占用,不应该被触及。

无论如何,我想你明白了。有什么帮助吗?

【问题讨论】:

  • 此类比喻通常用于操作系统中的外围模块或裸机嵌入式代码。它们的正确位置是在带有宏的标题中。在链接器文件中,它们占用的地址空间不适用于常规变量。所以,你的基本系统设计有问题。请参阅How to Ask 并提供minimal reproducible example
  • 正则变量是什么意思?
  • 由编译器和链接器管理的变量,而不是您的绝对地址。

标签: c++ c linker embedded


【解决方案1】:

我将开始合并 c 源代码和链接器。

在链接描述文件中定义一个新部分,例如:

MEMORY
{
  ...
  my_data       (rwx) : ORIGIN = your_start_addr, LENGTH = section_length
}

SECTIONS
{
  /* ... */

  .myVarSection section_address :
  {
    KEEP(*(.mySection)) 
  } > my_data

  /* ... */
}

然后你可以在源文件中定义你的变量,比如:

uint16_t __attribute__((section (".mySection"))) myVar = 0xDEAD;

【讨论】:

  • 你想为每个绝对变量设置一个单独的部分吗?
  • @Olaf 似乎 OP 正试图达到这样一个“结束”阈值。当然不是我在不同绝对地址定义许多变量的解决方案。
  • 这就是我要求 MCVE 的原因。问题不是很清楚。它有 XY 问题的痛风。
  • 我认为@LPs 的建议与我一直在寻找的很接近。例外是我不想要这些__attribute__ 员工。我有办法将它们放入my_data 但来自链接器脚本,而不是来自源文件? link
  • @Hairi 为什么要使用链接器而不是源文件?
猜你喜欢
  • 2015-05-05
  • 2014-04-22
  • 1970-01-01
  • 2011-12-11
  • 2013-06-03
  • 2018-11-09
  • 1970-01-01
  • 2013-04-01
  • 2017-06-15
相关资源
最近更新 更多