如何使用LD链接命令文件在特定地址放置常数?

8

我正在使用基于gcc的工具链在嵌入式处理器上开发c应用程序。在我的应用程序中,我需要在特定的内存位置放置一个标志。我需要帮助使用链接器命令文件语法来完成这个任务。


“place a flag”是什么意思?您是否需要在特定位置定义C变量,以便其他进程可以访问它?例如某种版本信息或引导选项? - parvus
2个回答

10

在您的C文件中编写类似以下内容:

static int flag __attribute__ ((section (".flag"))) __attribute__ ((__used__)) = 6;
在你的自定义链接脚本中,将.flag添加到所需的节(section)中:
_flag_start = 0x00001234;

.flag _flag_start :
{
  KEEP(*(.flag)) ;
}

请务必将此内容添加到正确的位置,因为位置指针只能不断增加。此块执行后,位置指针将设置为_flag_start + [您的标志的大小],这意味着所有后续部分都将放置在该地址或更高地址。

当然,阅读并使用David Grayson提供的手册。


2
感谢您的帮助,parvus。您的解决方案有效,但“KEEP”指令给我带来了链接器错误。也许是因为我使用的工具集有问题。一旦我将其删除,就可以正常运行了。 - ejwipp

1

我曾经在Cortex-M3上做过这个。我的链接脚本又长又复杂,也很私密,但是这个页面帮助我写了它,你也可能会发现它有用:

http://www.linuxselfhelp.com/gnu/ld/html_chapter/ld_3.html

我建议找到编译器默认使用的现有链接脚本,然后通过在特定地址添加一个特殊的部分并在源代码中将你的标志放入该部分来修改它。

你的答案没有问题,但是parvus提供了示例代码。感谢提供文档链接! - ejwipp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接