此“ ld”链接描述文件中的堆栈是否覆盖已存储的可执行文件?

时间:2019-04-07 18:54:47

标签: gnu ld riscv

我有一个关于此问题中链接脚本行为的问题:

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 :(得分:0)

是的,如果堆栈增长到足够大的程度,它将最终开始覆盖本不应该覆盖的部分内存。但这并非特定于此链接描述文件:最终,内存是有限的资源,任何堆栈都会增长太多,因为分配的自动变量过大和/或无法控制的递归调用最终将导致问题。