Я изучаю образец псевдонима области памяти GNU linker ld script.
Я вижу следующий фрагмент сценария ld:
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*/
So,
PLACE 1
говорит, что .rodata
ДОЛЖЕН перейти в REGION_RODATA
, то есть 256M~257M
PLACE 2
говорит, что раздел .data
ДОЛЖЕН быть размещен сразу после раздела .rodata
. Таким образом, .data
раздел ДОЛЖЕН начинаться с максимум 257M.
Но PLACE 3
говорит, что раздел .data
ДОЛЖЕН входить в область REGION_DATA
. Поэтому .data
раздел ДОЛЖЕН начинаться с не менее 512 МБ.
Так как же это могло быть возможно?