链接描述文件:混合内存区域和位置分配
Linker script: mixing memory regions and location assignments
我一直在查看一些用于嵌入式 ARM 处理器的链接描述文件。其中之一,有这样的东西(最小的例子):
MEMORY {
REGION : ORIGIN = 0x1000, LENGTH = 0x1000
}
SECTIONS {
.text : {
/* ... */
. = 0x20;
/* ... */
} > MEMORY
}
此链接描述文件指出 .text
部分应位于从 0x1000
开始的内存区域 REGION
中。但是,在部分内容中,位置明确设置为 0x20
.
此位置分配是否相对于该部分所在区域的起点?还是绝对?一般来说,区域和位置分配如何协同工作?
我做了一个测试。我创建了一个包含以下内容的程序集文件:
.text
.word 0x1234
然后我写了一个基本的链接描述文件,详见问题:
MEMORY {
REGION : ORIGIN = 0x100, LENGTH = 0x100
}
SECTIONS {
.text : {
. = 0x20;
*(.text);
} > REGION
}
我用 GCC 将汇编文件编译成目标文件,然后用 ld 将目标文件链接到“可执行文件”。 运行 objdump -s
结果,我发现0x1234在地址0x120。这意味着位置分配是相对于内存区域的开始。
我一直在查看一些用于嵌入式 ARM 处理器的链接描述文件。其中之一,有这样的东西(最小的例子):
MEMORY {
REGION : ORIGIN = 0x1000, LENGTH = 0x1000
}
SECTIONS {
.text : {
/* ... */
. = 0x20;
/* ... */
} > MEMORY
}
此链接描述文件指出 .text
部分应位于从 0x1000
开始的内存区域 REGION
中。但是,在部分内容中,位置明确设置为 0x20
.
此位置分配是否相对于该部分所在区域的起点?还是绝对?一般来说,区域和位置分配如何协同工作?
我做了一个测试。我创建了一个包含以下内容的程序集文件:
.text
.word 0x1234
然后我写了一个基本的链接描述文件,详见问题:
MEMORY {
REGION : ORIGIN = 0x100, LENGTH = 0x100
}
SECTIONS {
.text : {
. = 0x20;
*(.text);
} > REGION
}
我用 GCC 将汇编文件编译成目标文件,然后用 ld 将目标文件链接到“可执行文件”。 运行 objdump -s
结果,我发现0x1234在地址0x120。这意味着位置分配是相对于内存区域的开始。