64 lines
2.7 KiB
Plaintext
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.*)
|
|
}
|
|
}
|