c++ - 如何通过链接器脚本将符号放置在特定地址?

标签 c++ c linker embedded

它是关于 GNU 链接器的。

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

我使用的编译器有一个 __attribute__ ((blablabla)) 可以解决这个问题。但是我决定使用链接描述文件。

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

myVar  = 0xDEAD;

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

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

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

最佳答案

我会开始合并 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;

关于c++ - 如何通过链接器脚本将符号放置在特定地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38239722/

相关文章:

c++ - 内存栅栏会减慢所有 CPU 内核的速度吗?

c++ - 将字符值输入到 int 数组中?

c++ - 关于在 Visual Studio 2010 中使用 strcpy(),我不明白什么?

c++ - 如何将结构中的指针指向同一结构的另一个成员

c - 尝试使用扫描值在 C 中创建二叉搜索树

javascript - 将 C 中请求的数据返回到 ajax(jquery) CGI

c - 了解并行线程执行

c++ - llvm-ld 仍然存在于 clang 3.4 吗?

c++ - 遍历特定部分中的所有符号并获取它们的签名

ios - 将 OpenCV 与 MonoTouch 链接返回 "Undefined symbols for architecture i386"错误