BMOSP/configs/linker.ld

64 lines
2.7 KiB
Plaintext

/* Сообщаем компоновщику, что мы хотим получить выходной файл в формате 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/ : {
*(.eh_frame)
*(.note .note.*)
}
}