【问题标题】:How can I put some memory section in particular memory我怎样才能把一些内存部分放在特定的内存中
【发布时间】:2020-03-16 20:22:41
【问题描述】:

我正在尝试理解 GCC 链接脚本并创建一个小演示来练习,但是我从 ld 得到了“语法错误”。我感谢任何 cmets 或建议。非常感谢!

你好.c

__attribute__((section(".testsection"))) volatile int testVariable;

你好.ld

MEMORY {
  TEST_SECTION: ORIGIN = 0x43840000 , LENGTH = 0x50    
}
SECTIONS{
.testsection: > TEST_SECTION /* Syntax error here*/
}

编译命令

gcc -T hello.ld -o hello hello.o
c:/gnu/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe:../hello.ld:20: syntax error
collect2.exe: error: ld returned 1 exit status

【问题讨论】:

  • 你试过 .testsection : { (.testsection) } > TEST_SECTION
  • 感谢您的评论,我尝试了 .testsection : { *(.testsection) } > TEST_SECTION,我没有收到错误,但我仍然遇到了与 testsection 相同的错误:{ (.测试部分)} > TEST_SECTION 。我不确定 .testsection : { *(.testsection) } > TEST_SECTION 是正确的方法。
  • .text : { *(.text*) } > rom 是我用于 .text、.rodata、.bss 等的,它们工作得很好,所以我想我会把它扔在那里.您是否阅读了 gnu 链接器文档?嗯,也许某些格式发生在评论中有星号,您的回复显示在括号前面。现在它显示星号
  • rom : ORIGIN = 0x08000000, LENGTH = 0x1000 原点值和长度之间的逗号怎么样?错误消息告诉您问题出在哪一行
  • 你没有指出 ld 抱怨的是哪一行。

标签: gcc memory arm ld


【解决方案1】:

原帖

MEMORY {
  TEST_SECTION: ORIGIN = 0x43840000 LENGTH = 0x50    
}
SECTIONS{
.testsection: > TEST_SECTION
}

解决方案

MEMORY {
  TEST_SECTION: ORIGIN = 0x43840000, LENGTH = 0x50    
}
SECTIONS{
.testsection: { *(.testsection*) } > TEST_SECTION
}

我认为它缺少两件事。

首先是原始值和 LENGTH 之间的逗号。

第二个部分命令丢失。我认为 GNU 链接器脚本语法不允许这样做,您可能需要在其中放一些东西才能让它有用。你可以试试

.testsection: { } > TEST_SECTION

但我没有尝试过的猜测是,你不会在那个记忆中得到任何东西。

编辑

做完实验后:

所以.s

.text
add r0,r0,r0
add r1,r2,r3
add r1,r1,r1
add r2,r2,r2

so.ld

MEMORY
{
    bob : ORIGIN = 0x30000000, LENGTH = 0x1000
    ted : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .hello : { *(.text*) } > bob
    .world : { } > ted
    .text : { } > ted
}

Disassembly of section .hello:

30000000 <.hello>:
30000000:   e0800000    add r0, r0, r0
30000004:   e0821003    add r1, r2, r3
30000008:   e0811001    add r1, r1, r1
3000000c:   e0822002    add r2, r2, r2

正如我所怀疑的,首先我已经在 MEMORY 中新的名称是您想要的任何名称,正如您所看到的,RAM、ROM 等不是特殊名称,如果有的话,不能使用保留名称。我怀疑 SECTIONS 的工作方式与左侧的内容相同,即您为输出创建的新名称。这构建和链接得很好(显然不是一个真正的程序,足以让工具进行演示)。

链接器没有抱怨,但与此同时,由于 ted 中实际上没有放置任何内容,因此输出二进制文件中的该内存空间中没有放置任何内容。 .hello 和 .text 不必匹配,一个是输出名称,一个是输入名称,通常对于简单的东西,人们会让它们匹配,为什么要创建一个新名称。此处仅出于演示目的,以表明通过在左侧使用相同的名称不会自动将输入部分包含到输出中。

我强烈建议进行这样的实验,并使用 readelf 和 objdump 等工具来检查正在发生的事情(以及阅读脚本语言的文档)。

【讨论】:

  • 感谢您的精彩回答。从中学到了很多。实际上,我正在尝试将 greenhills ld 文件移植到 GCC 链接脚本。我创建了这个简单的小程序来显示一个问题。请检查stackoverflow.com/questions/60733509/…好吗? ,其实,我在多探索之后发现了更多。
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 2023-03-28
  • 2021-12-30
  • 2011-10-27
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多