2013-01-21 44 views
3

我剛剛開始使用LLVM。我寫了我自己的Hello傳遞,它工作正常。使用opt運行LLVM傳遞

現在我想從StackProtector.cpp運行堆棧保護程序,但我遇到了麻煩。當我看到源代碼,它看起來像我應該使用標誌-stack保護器:

INITIALIZE_PASS(StackProtector, "stack-protector", "Insert stack protectors", false, false) 

但這種標誌不會被選擇的認可。

我不確定要「加載」哪個文件,因爲它不像裝載我自己的LLVMHello.so文件那麼簡單,而且我也找不到StackProtector.so文件;我相信這可能是問題所在。

編輯:

我終於從LLVMDev得到了答案。實際上,我想運行的通道是由llc執行的,而不是選擇。我找不到選項-stack-protector,但是,與

llc --help 

因爲此選項被隱藏。相反,如果我做

llc --help-hidden 

它表明通是存在的,而我只需要運行

llc -print-before=stack-protector <input> 

回答

2

首先,你在你的密碼補充:

static RegisterPass<StackProtector> X("StackProtector", "Insert stack protectors", false, false); 

其次,終端當你運行目標文件時,在運行make之後,你有類似的東西:

//home/YOURNAME/llvm/Release+Asserts/bin/opt -load //home/YOURNAME/llvm/Release+Asserts/lib/StackProtector.so -StackProtector //home/YOURNAME/llvm/tools/clang/woRKSPACE/Test.bc 

其中Test.bc是您的目標代碼。另外,請注意:在您的Makefile中,不要忘記添加LIBRARYNAME = StackProtector

此外,要知道如果尚未註冊的通行證(如果是的話,你會得到一個segfault錯誤)

+0

嗯,這一關是不是自定義通,是可以發現一個內置的通LIB /的CodeGen。所以我想知道是否可以在不修改源代碼的情況下使用opt來運行此傳遞。 – Izabela

+1

這更簡單。使用我提供的相同命令並使用-THEIR_OPTIONAL_NAME。它適用於您創建的任何.so。 – Alex