2016-03-13 83 views
1

我是LLVM的新手,嘗試使用LLVM來完成檢測。具體來說,預計將在SP更新指令後插入進行一些檢查工作的呼叫。 SP-Update指令是那些隱含或明確修改寄存器的指令。例如,mov esp,eax是一個明確的SP-Update指令,而pop eax是一個隱含的指令。我必須對這些說明進行本地化並在他們之後添加我的檢查代碼。直觀地說,我需要修改後端部分。但我不知道應該挖掘哪些類別或功能。如果有人能幫助我?提前致謝。如何在使用LLVM的特定指令後插入呼叫?

+0

看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 –

回答

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