【问题标题】:How does local variables are symbolized on the stack?局部变量如何在堆栈上符号化?
【发布时间】:2022-12-20 03:51:52
【问题描述】:

函数的局部变量存储在堆栈中。每次我们调用一个函数时,它的局部变量都有不同的地址。当我们更改变量值时,操作系统/微控制器如何在幕后知道这个特定变量位于这个地址?

【问题讨论】:

  • 你问的是ASLR吗?
  • 简短的回答是每个函数都有一个栈帧——这是栈中为局部变量保留的区域,并在函数返回时再次释放。在英特尔系统 EBP/RBP 上,ESP/RSP 用于引用与当前堆栈帧相关的数据。
  • 因为局部变量是相对的到堆栈,每次运行并不总是相同。相对位置始终相同。

标签: c variables stack


【解决方案1】:

在典型的 C 实现中,局部变量是相对于堆栈指针或帧指针寻址的。

硬件堆栈是为在调用每个函数时维护函数本地数据而预留的内存区域。 CPU 寄存器中的堆栈指针或帧指针,用于保存堆栈当前活动部分的地址。调用函数时,堆栈指针或帧指针或两者都会调整为指向新空间。该函数使用堆栈指针或帧指针的偏移量将其数据存储在堆栈中。

当编译器处理函数的源代码时,它会为该函数规划堆栈上的数据布局。它知道每个对象相对于函数堆栈帧的偏移量,并使用指针寄存器的适当偏移量生成指令。

执行程序初始加载的软件为硬件堆栈分配内存并初始化堆栈指针和/或帧指针以指向它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2017-01-25
    • 2015-01-03
    相关资源
    最近更新 更多