【发布时间】:2013-12-14 15:47:18
【问题描述】:
我有一个包含 3 个部分的简单 asm 文件:
.code 32
.section sec1
MOV R3, #10
.section sec2
MOV R1, #10
.section sec3
MOV R2, #10
.end
还有一个链接脚本:
MEMORY
{
ram : ORIGIN = 0x00200000, LENGTH = 1K
rom : ORIGIN = 0x00100000, LENGTH = 1K
}
SECTIONS
{
.text :
{
*(.glue_7t)
*(.glue_7)
*(.text)
}>rom
.sec1 :
{
*(sec1)
}>rom
.sec2 :
{
_ram_start = .;
*(sec2)
}>ram AT> rom
.sec3 :
{
*(sec3)
}>ram AT> rom
.data :
{
*(.data)
}>ram
.bss :
{
*(.bss)
}>ram
}
我假设 .sec2 应该将 VMA 地址设置为 ram 的来源,但 LMA 应该是 .sec1 之后的地址,但是 objdump 给了我:
test2.o: file format elf32-littlearm
Sections:
Idx Name Size VMA LMA File off Algn
0 .sec1 00000004 00100000 00100000 00000034 2**0
CONTENTS, READONLY
1 .sec2 00000004 00200000 00200000 00000038 2**0
CONTENTS, READONLY
2 .sec3 00000004 00200004 00200004 0000003c 2**0
CONTENTS, READONLY
为什么 .sec2 LMA 设置为 ram?
【问题讨论】:
-
我从来没有遇到过
AT>REGION。我建议您使用sec1_end = .; .sec3 : AT(sec1_end) { ... } >ram的形式。这与ld giving unexpected load address 非常相似。对此的真正测试是使用objcopy制作二进制文件并查看文件大小。是 24 字节还是 0x1008 字节。 -
顺便说一句,您确定要不要将 .data 部分也放在 rom 上吗?
-
这只是一个测试脚本,只是为了让我了解链接器引擎盖下的内容。 .data 部分通常会转到 rom,是的。
标签: linker embedded arm ld elf