我是LLVM的新手,嘗試使用LLVM來完成檢測。具體來說,預計將在SP更新指令後插入進行一些檢查工作的呼叫。 SP-Update指令是那些隱含或明確修改寄存器的指令。例如,mov esp,eax是一個明確的SP-Update指令,而pop eax是一個隱含的指令。我必須對這些說明進行本地化並在他們之後添加我的檢查代碼。直觀地說,我需要修改後端部分。但我不知道應該挖掘哪些類別或功能。如果有人能幫助我?提前致謝。如何在使用LLVM的特定指令後插入呼叫?
1
A
回答
2
通常llvm會爲生成的函數準備框架,我認爲您對inline彙編感興趣的次數超過了esp寄存器的正常更新。
無論如何,您可以轉到lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp源文件並修改函數X86ATTInstPrinter :: printInst,以便對於有問題的說明,它將打印一些附加代碼。
類似的東西:
if (MI->getOpcode() == X86::PUSH16r
|| MI->getOpcode() == X86::PUSH32r
|| MI->getOpcode() == X86::PUSH64r) {
OS << "\tcall your_function\n";
}
因此,假設你加入這個地方的代碼和編譯LLVM的二進制LLC。 有你如何使用一個例子:
MC:
#include <stdio.h>
void your_function() {
printf("your_function called\n");
}
void foo();
int main() {
foo();
}
TC:
void foo() {
asm("push %rax");
asm("pop %rax");
}
然後你使用內置LLVM的二進制文件下面的命令:
clang t.c -c -emit-llvm
llc t.bc
llvm-mc t.s -o t.o -filetype=obj
clang m.c t.o -o ttt
現在您可以運行該文件並獲得所需的結果:
./ttt
your_function called
your_function called
順便說一句,請注意,這兩個打印是從推送指令其中之一是在一字形組件而另一個是在LLVM生成FOO函數的幀,而不是從彈出指令
+0
我在彙編代碼中實現了一個自包含的函數。接下來,我會在特定說明後插入它。但是如果我將這個函數擴展到我將要插入的任何地方,生成的程序集文件可能有點多餘。那麼如何在一個地方插入這個函數,以便在插入時可以使用'call function'? @wvoquine – Matthewxie
相關問題
- 1. 如何在LLVM中使用CreateCall插入多條呼叫指令
- 2. 如何插入LLVM指令?
- 3. LLVM IRBuilder:在特定指令後設置插入點
- 4. 使用LLVM在當前指令之後插入函數調用
- 5. 呼叫指令
- 6. 「呼叫」 指令
- 7. LLVM IR指令插入
- 8. 插入GetElementpointer指令在LLVM IR
- 9. LLVM「指令不稱霸所有用途」 - 插入新的指令
- 10. 如何使用傳入呼叫播放特定號碼的特定聲音
- 11. 呼叫與角指令
- 12. 呼叫角功能指令
- 13. 如何在紅外文件llvm中插入添加指令?
- 14. 呼叫使用命令行
- 15. 呼叫功能插入
- 16. 呼叫子插入操作
- 17. 如何僅使用sinon.stub()存儲特定的呼叫
- 18. INT與Asm指令上的呼叫
- 19. 來自控制器的呼叫指令
- 20. 如何指定LLVM
- 21. 如何在使用jQuery的特定元素之後插入html
- 22. 如何使用Reachibility呼叫
- 23. 呼叫AngularJS指令上點擊
- 24. AngularJS - 呼叫控制功能從指令
- 25. Angularjs指令呼叫控制器功能
- 26. 呼叫指令使用控制器範圍內的數據
- 27. 如何在LLVM中打印出指令?
- 28. invoke指令在LLVM中如何工作?
- 29. 如何在llvm中打印指令
- 30. Android的:如何在ListView插入一個呼叫按鈕
看HTTP ://eli.thegreenplace.net/2013/02/25/a-deeper-look-into-the-llvm-code-generator-part-1和http://stackoverflow.com/questions/29735683/llvm-backend -replacing-indirect-jmps-for-x86-backend –