我做了一个测试。我创建了一个包含以下内容的程序集文件:
我一直在研究一些用于嵌入式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。这意味着位置分配相对于内存区域的开始。