如何解决这个链接器脚本错误?

时间:2014-02-04 16:40:13

标签: c eclipse gcc linker linker-scripts

我创建了一个链接描述文件memory.ld -

MEMORY
{
        MYMEMORY(rw)   : ORIGIN = 0x0041c620 ,  LENGTH = 30
}

.myvars (NOLOAD) :
{
  *(.myvarloc)

} > MYMEMORY


In my c program :
__attribute__((section(".myvarloc")))
   uint8 measurements[30];

我在linux rtos上使用eclipse IDE。 我在项目中添加了-T memory.ld - 属性 - 链接器 - 库 - 在eclipse中杂项 我创建这个是因为: 我想要一个固定的内存地址,用于从0x0041c620开始的大小为30的变量测量。

我的问题: 这样做是对的吗? 如果我喜欢上述:我收到错误 - 链接器输入文件未使用且链接未完成。

注意:我正在重新发布这个问题。

2 个答案:

答案 0 :(得分:0)

这很可能是因为Eclipse没有直接调用链接器。相反,它使用gcc(或g++)作为包装器,而后者又使用默认链接描述文件调用链接器。

如果您正在为修复内存的特定目标进行交叉编译,那么最好的办法就是制作自己的makefile直接调用链接器。

如果您进行交叉编译, Windows或Linux,然后不要做你正在做的事情!您实际上并不知道链接器脚本中的虚拟地址实际上可供您使用。并且您不能将它用于在进程之间共享内存,因为一个进程中的虚拟地址实际上可能与另一个进程中的相同虚拟地址不同(即使两个进程都是从同一个可执行文件创建的)。请阅读有关shared memory或其他inter-process communication方法的内容。

答案 1 :(得分:0)

除非你的程序非常简单,否则链接器脚本可能包含的内容比你放入的程序要多。通常会有.text(代码,通常只读),。数据(r / w,初始化),。bss(r / w,零填充)加上其他一些,具体取决于你的工具链产生什么以及你的RTOS '运行时期望。

一句话是,从头开始只有在你已经知道自己在做什么或项目是否非常简单的情况下才有效。

在你的情况下,我可能会从链接器脚本默认开始使用的链接器脚本开始,然后只调整你需要的部分。

您可以通过运行gcc-for-your-platform some-file.c -Wl,-verboseld-for-your-platform -verbose来获取默认链接描述文件。