2011-07-26 35 views
0

我想实现Xor随机金丝雀,所以我必须在函数的序言和结尾处获取返回地址。如何在LLVM上获取栈上的返回地址

在功能的序幕,之前我插入堆栈上的金丝雀,我可以得到的返回地址:

ConstantInt* ci = llvm::ConstantInt::get(Type::getInt32Ty(RI->getContext()), 0); 
Value* Args1[] = {ci}; 
CallInst* callInst = CallInst::Create(Intrinsic::getDeclaration(M, Intrinsic::returnaddress), 
       &Args1[0], array_endof(Args1), "Call Return Address", InsPt); 

callInst将获得返回地址和它的作品。

虽然,在功能的结尾,由于金丝雀已被插入。我写了类似的代码:

ConstantInt* ci2 = llvm::ConstantInt::get(Type::getInt32Ty(RI->getContext()), 1); 
Value* Args3[] = {ci2}; 
CallInst* callInst1 = CallInst::Create(Intrinsic::getDeclaration(M, Intrinsic::returnaddress), 
      &Args3[0], array_endof(Args3), "Caaall Return Address", BB); 

但是这次不行。我无法得到返回地址。

什么是问题?我怎样才能得到返回地址?

回答

0

我不知道为什么这样做,但在后记中,您呼叫

llvm.returnaddress i32 1 

它试图获取调用堆栈上以前函数的返回地址。即使你插入了一个金丝雀,你仍然希望在尾声中的返回地址功能功能。所以,你应该,就像你在序言做,叫

llvm.returnaddress i32 0 

正如一个侧面说明,称llvm.returnaddress与其他比0可能会无法正常工作参数。从docs

此内在函数返回的值可能不正确,或者对于非零的参数可能为0,所以它只应用于调试目的。

相关问题