Код: Выделить всё
PHDRS
{
phdr PT_PHDR FLAGS(4) FILEHDR PHDRS;
interp PT_INTERP FLAGS(4);
text PT_LOAD FLAGS(5) FILEHDR PHDRS;
dynamic PT_DYNAMIC FLAGS(6);
data PT_LOAD FLAGS(6);
rodata PT_LOAD FLAGS(4);
note PT_NOTE FLAGS(4);
tls PT_TLS FLAGS(6);
eh_frame PT_GNU_EH_FRAME;
relro PT_GNU_RELRO;
}
Код: Выделить всё
SECTIONS
{
. = SIZEOF_HEADERS;
.interp : { *(.interp) } :interpreter :rodata
.note.gnu.build-id : { *(.note.gnu.build-id) } :note :rodata
.hash : { *(.hash) } :rodata
.gnu.hash : { *(.gnu.hash) } :rodata
.dynsym : { *(.dynsym) } :rodata
.dynstr : { *(.dynstr) } :rodata
.relr.dyn : { *(.relr.dyn) } :rodata
.init : { KEEP (*(SORT_NONE(.init))) } :text
.plt : { *(.plt) *(.iplt) } :text
.plt.got : { *(.plt.got) } :data
.plt.sec : { *(.plt.sec) } :data
.eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } :rodata :eh_frame
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } :rodata
.tdata :
{
PROVIDE_HIDDEN (__tdata_start = .);
*(.tdata .tdata.* .gnu.linkonce.td.*)
} :data :tls
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } :data :tls
.data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) } :data :relro
.dynamic : { *(.dynamic) } :dynamic :data :relro
.got : { *(.got) *(.igot) } :data :relro
.got.plt : { *(.got.plt) *(.igot.plt) } :data :relro
.data : {
*(.data .data.* .gnu.linkonce.d.*)
SORT(CONSTRUCTORS)
} :data
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(. != 0 ? 64 / 8 : 1);
} :data
}
Код: Выделить всё
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
...
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x00000000000006b1 0x00000000000006b1 R E 0x1000
...
LOAD 0x00000000000017a0 0x00000000000007a0 0x00000000000007a0
0x0000000000000248 0x0000000000000250 RW 0x1000
LOAD 0x0000000000001270 0x0000000000000270 0x0000000000000270
0x000000000000052d 0x000000000000052d R 0x1000
...
Я попробовал добавить . = ALIGN(0x1000); в строке перед первым использованием каждого имени phdr, чтобы посмотреть, не переместит ли это сегменты на отдельные страницы в виртуальной памяти, но это не сработало — разделы все равно перекрывались.
Корень проблемы в том, что я не понимаю, как ld "." Счетчик местоположения ведет себя по отношению к сегментам. Когда PHDRS не указан, из примеров в документации ld видно, что это монотонный указатель, который увеличивается на размер раздела каждый раз, когда создается новый выходной раздел. А вот если заголовки программы s1 и s2 именно в таком порядке и я пишу
Код: Выделить всё
.a: { *(.a) } :s1
.b: { *(.b) } :s2
.c: { *(.c) } :s1
Если бы кто-нибудь мог указать мне на некоторые ресурсы по этому вопросу, чтобы я мог лучше понять, я был бы очень признателен.
Подробнее здесь: https://stackoverflow.com/questions/791 ... n-segments