0

我创建了一个链接器脚本文件作为 memory.ld –</p>

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。我在 Eclipse 中的项目-属性-链接器-库-杂项中添加了-T memory.ld 我创建它是因为:我想要一个固定的内存地址,用于从 0x0041c620 开始的大小为 30 的变量测量值。

我的问题:这样做是否正确?如果我确实喜欢上面的内容:我收到错误 - 链接器输入文件未使用且链接未完成。

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

4

2 回答 2

0

这很可能是因为 Eclipse 不直接调用链接器。相反,它使用gcc(or g++) 作为包装器,然后使用默认链接器脚本调用链接器。

如果您要为固定内存的特定目标进行交叉编译,最好的办法可能是制作自己的 makefile 直接调用链接器。

如果您不是交叉编译,而是为 Windows 或 Linux 构建,那么不要做您正在做的事情!您并不真正知道您在链接描述文件中拥有的虚拟地址实际上对您可用。而且您不能使用它在进程之间共享内存,因为一个进程中的虚拟地址实际上可能与另一个进程中的相同虚拟地址不同(即使两个进程都是从同一个可执行文件创建的)。而是阅读有关共享内存或其他进程间通信方法的信息。

于 2014-02-05T08:37:34.030 回答
0

除非您的程序非常简单,否则链接描述文件可能包含的内容比您放入的要多。通常会有 .text(代码,通常是只读的)、.data(r/w,已初始化)、.bss(r/w,零填充)以及其他一些,具体取决于您的工具链生成的内容和您的 RTOS ' 运行时期望。

底线是,只有在您已经知道自己在做什么或者您的项目非常简单的情况下,从头开始才有效。

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

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

于 2014-02-13T01:43:57.047 回答