我使用llvm3.8來創建一個ModulePass
,給定一個函數名稱,它遍歷所有模塊的函數並搜索該名稱。 一旦找到函數,就會用隨機選擇的字符串重命名它。LLVM - 模塊內部的重命名功能
我需要運行在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
,但不知道在這種情況下應該使用哪一個。
爲了重命名功能,我試過2種不同的方法,找到後功能:
- 通過以下this answer:只需調用該函數的
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();
這是失敗的鏗鏘錯誤:Running pass 'replaces function with a clone with a different name' on function.
'EP_EarlyAsPossible'用於函數傳遞,我很確定。它會通過模塊傳遞進行編譯,但會做奇怪的事情。您可能想要爲「EP_ModuleOptimizerEarly」和「EP_EnabledOnOptLevel0」註冊它。當你說它不能編譯'EP_ModuleOptimizerEarly'時,請顯示錯誤。 –
只要按照'EP_ModuleOptimizerEarly'和'EP_EnabledOnOptLevel0'的註冊建議,'setName()'解決方案就能正常工作。如果你在帖子中添加評論,我會很樂意將它標記爲答案! – Carlinho89