/* Сообщаем компоновщику, что мы хотим получить выходной файл в формате x86_64 ELF64 */ OUTPUT_FORMAT(elf64-x86-64) OUTPUT_ARCH(i386:x86-64) /* Мы хотим, чтобы символ _start был нашей точкой входа */ ENTRY(_start) /* Определяем заголовки программы, чтобы загрузчик дал нам правильные */ /* разрешения MMU */ PHDRS { text PT_LOAD FLAGS((1 << 0) | (1 << 2)) ; /* Execute + Read */ rodata PT_LOAD FLAGS((1 << 2)) ; /* Read only */ data PT_LOAD FLAGS((1 << 1) | (1 << 2)) ; /* Write + Read */ dynamic PT_DYNAMIC FLAGS((1 << 1) | (1 << 2)) ; /* Динамический PHDR для учёта перерасположений */ } SECTIONS { /* Мы хотим быть размещены в верхних 2 ГБ адресного пространства, для оптимизации */ /* и потому что это предписывает спецификация Limine. */ /* Любой адрес в этом регионе подойдет, но часто выбирают 0xffffffff80000000, так как это */ /* начало региона. */ . = 0xffffffff80000000; .text : { *(.text .text.*) } :text /* Переходим на следующую страницу памяти для .rodata */ . += CONSTANT(MAXPAGESIZE); .rodata : { *(.rodata .rodata.*) } :rodata /* Переходим на следующую страницу памяти для .data */ . += CONSTANT(MAXPAGESIZE); .data : { *(.data .data.*) } :data /* Динамический раздел для перерасположений, как в собственном PHDR, так и внутри раздела data */ .dynamic : { *(.dynamic) } :data :dynamic /* Примечание: .bss должен быть последней вещью, отображаемой в раздел data, иначе много */ /* ненужных нулей будет записано в бинарный файл. */ /* Если вам, например, нужны .init_array и .fini_array, они должны быть размещены */ /* выше этого. */ .bss : { *(.bss .bss.*) *(COMMON) } :data /* Игнорируем разделы .note.* и .eh_frame, так как они могут вызывать проблемы на некоторых хостах. */ /DISCARD/ : { *(.comment) *(.eh_frame) *(.note .note.*) } }