Это немного другое. Есть скрипт линкера
MEMORY
{
RAM (rwx) : ORIGIN = 0x20020000, LENGTH = 0x00018000
}
PHDRS
{
_RAM1 PT_LOAD;
_RAM2 PT_LOAD;
}
SECTIONS
{
PrgCode : { KEEP(*(.text)) } > RAM : _RAM1
PrgData : { KEEP(*(.bss)) *(COMMON) } > RAM : _RAM1
DevDscr : { KEEP(*(DevDscr DevDscr.*)) } > RAM : _RAM2
}
Он приводит к появлению двух сегментов:
arm-none-eabi-readelf.exe -l xxx.elf
Elf file type is EXEC (Executable file)
Entry point 0x0
There are 2 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x010000 0x20020000 0x20020000 0x00030 0x00038 RWE 0x10000
LOAD 0x010038 0x20020038 0x20020038 0x010a0 0x010a0 R 0x10000
Section to Segment mapping:
Segment Sections...
00 PrgCode PrgData
01 DevDscr
Если изменить скрипт линкера без PHDRS, то будет всего один сегмент:
arm-none-eabi-readelf.exe -l xxx.elf
Elf file type is EXEC (Executable file)
Entry point 0x0
There are 1 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x010000 0x20020000 0x20020000 0x010d8 0x010d8 RWE 0x10000
Section to Segment mapping:
Segment Sections...
00 PrgCode PrgData DevDscr