2012-01-26 21 views
7

Ho bisogno di convertire il codice sorgente del gruppo x86 in file LLVM leggibile da umani (noto anche come linguaggio assembly LLVM). Come posso fare questo? Se non esiste una soluzione diretta, sarebbe possibile implementarne uno all'interno dell'infrastruttura LLVM con il minor sforzo possibile?Compilazione origine-origine con LLVM

Indovino, la soluzione che sto cercando dovrebbe essere una sorta di controparte llc che converte il file .s in rappresentazione .ll.

+3

Questa domanda è stata già posta e ha risposto. Non c'è una soluzione diretta a causa di molte cose (ad esempio rami indiretti). Potresti trovare utile il progetto come llvm-qemu e libcpu. In ogni caso, questa domanda è un dup di http://stackoverflow.com/questions/6981810/translation-of-machinecode-into-llvm-ir-disassembly-reassembly-of-x86-64-x86 –

+1

Grazie. Ho già dato un'occhiata a quei progetti che hai menzionato. Sfortunatamente, _llvm-qemu_ sembra morto. E _libcpu_ sembra andare nel proprio modo di assemblare l'analisi piuttosto che usare l'infrastruttura di LLVM (quindi sembra essere incompleto nel supportare l'ISA x86). In realtà, pensavo che lo strumento che sto cercando dovesse fare il lavoro di ** AsmPrinter ** di LLVM, ma in direzione inversa, traducendo le istruzioni native ISA in _MachineInstr_ di LLVM o _MCInst_ di LLVM-MC. – bsa2000

+0

E il sottoprogetto di LLVM ** llvm-mc **? Ha una classe _AsmParser_ in grado di mangiare file .s e generare la sua rappresentazione basata sulla classe _MCInst_. In questo caso l'unica parte rimasta annullata è quella di tornare indietro nella direzione rispetto alla classe _MCLowering_ verso la rappresentazione basata su _MachineInstr_ di LLVM. – bsa2000

risposta

8

Solo per coloro che sono ancora alla ricerca di ulteriori informazioni su questo argomento, voglio condividere le informazioni su un progetto in corso (http://dslab.epfl.ch/proj/s2e) che ho trovato sul web. Il progetto ha due componenti:

  1. x86-to-LLVM backend per traduzione dinamica di codice macchina x86 LLVM IR
  2. RevGen strumento di analisi statica di file binari x86, in grado di tradurre assembly x86 linea di LLVM IR

Qui è RevGen prototipo: RevGen accetta come input un binario x86 e genera un modulo LLVM equivalente in tre passaggi. Innanzitutto, RevGen cerca tutti i blocchi di codice eseguibili e li converte in blocchi di traduzione LLVM. In secondo luogo, quando non ci sono più blocchi di traduzione da coprire, RevGen li trasforma in blocchi di base e ricostruisce il grafico del flusso di controllo del binario originale in formato LLVM. Terzo, RevGen risolve le chiamate alle funzioni esterne per costruire il modulo LLVM finale. Per l'analisi dinamica, un ultimo passaggio collega il modulo LLVM con una libreria run-time che consente l'esecuzione del modulo LLVM.

+0

Questi strumenti servono per lavorare con programmi già assemblati. a meno che tu non sia in grado di produrre codice LLVM/IR da un x86 .ASM? – TechZilla

+0

@techzilla ha trovato qualcosa a partire dal codice sorgente x86? – franck