【问题标题】:Does the stack in this 'ld' linker script overwrite the stored executable?此“ld”链接描述文件中的堆栈是否覆盖存储的可执行文件?
【发布时间】:2019-04-07 18:54:46
【问题描述】:

我对在这个问题中找到的链接器脚本的行为有疑问:

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_startSIZEOF_HEADERS 是什么?

【问题讨论】:

    标签: gnu ld riscv


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2015-05-02
      • 1970-01-01
      相关资源
      最近更新 更多