Перезаписывает ли стек в этом сценарии компоновщика 'ld' сохраненный исполняемый файл? - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть вопрос о поведении сценария компоновщика, найденный в этом вопросе:

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, если стек станет достаточно большим?

1 Ответ

0 голосов
/ 08 апреля 2019

Да, если стек станет достаточно большим, он в конечном итоге начнет перезаписывать части памяти, которые не должны. Но это не является специфическим для этого сценария компоновщика: в конечном счете, память является конечным ресурсом, и любой стек растет слишком сильно, потому что слишком большие автоматические переменные выделяются и / или выходят из-под контроля рекурсивные вызовы могут привести к проблемам.

...