У меня есть вопрос о поведении скрипта компоновщика, найденного в этом вопросе:
https://stackoverflow.com/a/55193198/2421349
Чтобы сэкономить вам клик, релевантная часть:
OUTPUT_ARCH(riscv)
MEMORY
{
/* qemu-system-risc64 virt machine */
RAM (rwx) : ORIGIN = 0x80000000, LENGTH = 128M
}
ENTRY(_start)
И в следующем разделе:
PROVIDE (__executable_start = SEGMENT_START("text-segment", ORIGIN(RAM)));
. = SEGMENT_START("text-segment", ORIGIN(RAM)) + SIZEOF_HEADERS;
PROVIDE(__stack_top = ORIGIN(RAM) + LENGTH(RAM));
Мы устанавливаем __executable_start
на начало ORIGIN(RAM)
. Затем мы используем команду .
, чтобы переместить место вывода компоновщика на SIZEOF_HEADERS
байтов вперед. И, наконец, устанавливаем __stack_top = ORIGIN(RAM) + LENGTH(RAM)
.
Предполагая, что стек вырастет до ORIGIN(RAM)
, не будет ли он в конечном итоге перезаписан __executable_start
и что бы там ни было SIZEOF_HEADERS
, если стек станет достаточно большим?