我正在使用llvm3.8创建一个ModulePass
,给定一个函数名称,它遍历所有Modules的函数并搜索该名称。
找到Function后,它会使用随机选择的String重命名它。
我需要在iOS xcodeproject上运行此传递,所以我通过在OTHER_C_FLAGS
中编写,在项目的构建设置中执行命令:
-Xclang -load -Xclang path/to/my/ModulePass/RenameFunction.dlyb -mllvm -funcName="functionName"
我无法弄清楚的第一件事就是我应该使用的扩展点来正确地重命名该函数:
static RegisterStandardPasses RegisterClangPass(PassManagerBuilder::EP_EarlyAsPossible, registerClangPass);
我尝试使用EP_EarlyAsPossible
,EP_ModuleOptimizerEarly
和EP_EnabledOnOptLevel0
,但实际上并不知道在这种情况下应该使用哪一个。
为了重命名该功能,我在找到函数后尝试了两种不同的方法:
setName()
方法,将其设置为我想要的字符串。 for (Module::iterator F = tmp->begin(), E = tmp->end(); F != E; F++) {
Function *_F(F);
if(checkName(_F->getName())){
_F->setName(newNameString);
}
}
这不会为EP_ModuleOptimizerEarly
编译。它为EP_EarlyAsPossible
和EP_EnabledOnOptLevel0
编译并运行,但是,通过对应用程序的二进制文件进行逆向工程,我发现该名称并没有真正改变......
我尝试克隆原始函数,重命名它,使用新克隆更改所有原始函数的用法并删除原始函数。
Function *clone = CloneFunction(_F, vMap, true);
clone->setLinkage(GlobalValue::InternalLinkage);
_F->getParent()->getFunctionList().push_back(clone);
clone->setName(func_name);
_F->replaceAllUsesWith(clone);
_F->eraseFromParent();
这是因为clang错误而失败:Running pass 'replaces function with a clone with a different name' on function.
答案 0 :(得分:1)
第一种方法是正确的方法。您遇到的任何问题都可能是因为您的通行证已被注册。
EP_EarlyAsPossible
用于函数传递。它将使用模块传递进行编译,但会做一些奇怪的事情。
如果您希望模块传递始终运行,则应为EP_EnabledOnOptLevel0
和EP_ModuleOptimizerEarly
注册。