【问题标题】:Is there any way to know the stack address of stack allocated local variable created using alloca instruction in LLVM有没有办法知道在 LLVM 中使用 alloca 指令创建的堆栈分配的局部变量的堆栈地址
【发布时间】:2018-11-11 14:59:48
【问题描述】:

我有一个简单的添加程序。

int main() {

    int x=10,y=10,result=0;
    result=x+y;
    return 0;
}

我创建了一个可以遍历整个模块的 LLVM 前端模块通道。

所以我的 pass 遍历基本块并获取我的指令。

FORE(iter, (*bb)) {
    if(isa<AllocaInst>(iter)) {
        errs()<<"The address of allocated variable is "<<&(*iter);
    }
} 

它的输出将是 alloca 指令的地址,而不是局部变量的实际堆栈地址。

有什么方法可以通过pass获取局部变量的栈地址吗?

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    你不能。

    当你多次运行程序时,甚至不能保证变量的地址是相同的(见Address Space Layout Randomization),所以没有办法静态地预测地址。

    即使我们确实知道堆栈总是从一个固定地址开始,但在函数的不同调用期间,同一个变量具有不同的地址是完全正常的。以此为例:

    #include <stdio.h>
    
    void f() {
      int x;
      printf("The address of x is: %p\n", &x);
    }
    
    void g() {
      int y;
      f();
    }
    
    int main() {
      f();
      g();
      return 0;
    }
    

    假设您在没有优化的情况下编译它(这将删除y 的定义),这将为x 打印两个不同的地址。因此,当查看f 的定义时,我们不可能预测其变量的地址,因为在同一程序运行中它甚至不会相同。

    此外,您的阶段不会知道哪些优化将在它之后运行,哪些变量将存储在寄存器中或哪些寄存器将溢出到堆栈内存 - 所有这些都会影响地址。

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      相关资源
      最近更新 更多