【发布时间】:2016-11-12 21:12:26
【问题描述】:
我正在学习 GNU 链接器 ld 脚本 sample about memory region alias。
我看到下面的ld脚本sn-p:
SECTIONS
{
.text :
{
*(.text)
} > REGION_TEXT
.rodata :
{
*(.rodata)
rodata_end = .;
} > REGION_RODATA <=========== PLACE 1
.data : AT (rodata_end) <=========== PLACE 2
{
data_start = .;
*(.data)
} > REGION_DATA <=========== PLACE 3
data_size = SIZEOF(.data);
data_load_start = LOADADDR(.data);
.bss :
{
*(.bss)
} > REGION_BSS
}
示例中给出的一种可能的系统内存区域布局如下所示(该示例中的C):
MEMORY
{
ROM : ORIGIN = 0, LENGTH = 2M /*0M ~ 2M*/
ROM2 : ORIGIN = 0x10000000, LENGTH = 1M /*256M ~ 257M*/
RAM : ORIGIN = 0x20000000, LENGTH = 1M /*512M ~ 513M*/
}
REGION_ALIAS("REGION_TEXT", ROM); /*0M ~ 2M*/
REGION_ALIAS("REGION_RODATA", ROM2); /*256M ~ 257M*/
REGION_ALIAS("REGION_DATA", RAM); /*512M ~ 513M*/
REGION_ALIAS("REGION_BSS", RAM); /*512M ~ 513M*/
所以,
PLACE 1 表示.rodata 必须进入REGION_RODATA,即256M~257M
PLACE 2 表示.data 部分必须立即放在.rodata 部分之后。所以.data 部分必须从最多 257M 开始。
但是PLACE 3 说.data 部分必须进入REGION_DATA 区域。所以.data 部分必须从至少 512M 开始。
那怎么可能呢?
【问题讨论】:
-
你能用这个脚本链接一些示例并使用 readelf/objdump 从中转储部分信息吗?