链接器脚本:混合内存区域和位置分配



我一直在研究一些用于嵌入式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。这意味着位置分配相对于内存区域的开始

最新更新