2016-11-24 34 views
0

我使用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_EarlyAsPossibleEP_ModuleOptimizerEarlyEP_EnabledOnOptLevel0,但不知道在這種情況下應該使用哪一個。

爲了重命名功能,我試過2種不同的方法,找到後功能:

  1. 通過以下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_EarlyAsPossibleEP_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.

    +0

    'EP_EarlyAsPossible'用於函數傳遞,我很確定。它會通過模塊傳遞進行編譯,但會做奇怪的事情。您可能想要爲「EP_ModuleOptimizerEarly」和「EP_EnabledOnOptLevel0」註冊它。當你說它不能編譯'EP_ModuleOptimizerEarly'時,請顯示錯誤。 –

    +0

    只要按照'EP_ModuleOptimizerEarly'和'EP_EnabledOnOptLevel0'的註冊建議,'setName()'解決方案就能正常工作。如果你在帖子中添加評論,我會很樂意將它標記爲答案! – Carlinho89

    回答

    1

    第一種方法是正確的。您遇到的任何問題都可能是因爲您的通行證已註冊。

    EP_EarlyAsPossible用於函數遍。它會通過模塊傳遞進行編譯,但會做奇怪的事情。

    如果您希望您的模塊通過始終運行,您應該將其註冊爲EP_EnabledOnOptLevel0EP_ModuleOptimizerEarly

    +0

    你期待什麼樣的「奇怪的事情」?我認爲它應該工作。 – Joky

    +0

    @Joky我記得嘗試過一次,得到一個奇怪的段錯誤,同時迭代模塊中的函數並花費一天的時間來追蹤它。如果您查看「PassManagerBuilder.cpp」中的代碼,則「EP_EarlyAsPossible」通道僅添加到函數通道管理器「FPM」。您可以添加任何'Pass *',但是在某種程度上它將'static_cast'到'FunctionPass *'的位置,如果它實際上不是'FunctionPass *',則爲UB。至少這就是我當時所從事的工作 - 這對我的C++技能來說完全掌握了太多模板。 –