2012-03-30 9 views
9

Sto cercando di generare un call-graph per il kernel linux che includa i puntatori di funzione (vedere la mia domanda precedente Static call graph generation for the Linux kernel per ulteriori informazioni). Mi è stato detto che LLVM dovrebbe essere adatto a questo scopo, tuttavia non sono stato in grado di trovare le informazioni pertinenti su llvm.orgCome utilizzare LLVM per generare un grafico di chiamata?

Qualsiasi aiuto, compresi i riferimenti alla documentazione pertinente, sarebbe apprezzato.

risposta

12

Prima di tutto, è necessario compilare il kernel in LLVM IR (anziché i file di oggetti nativi). Quindi, utilizzando llvm-ld, unisci tutti i file oggetto IR in un singolo modulo di grandi dimensioni. Potrebbe essere una cosa abbastanza complicata da fare, dovrai modificare i makefile pesantemente, ma credo che sia fattibile.

Ora puoi fare la tua analisi. Un semplice grafico di chiamata può essere generato utilizzando lo strumento opt con passaggio -dot-callgraph. È improbabile che gestisca i puntatori di funzione, quindi è consigliabile modificarlo.

Tenere traccia di tutti i possibili percorsi del flusso di dati che trasporteranno i puntatori di funzione è una vera sfida, e in generale è impossibile farlo (se ci sono puntatori a numeri interi, se i puntatori sono archiviati in strutture dati complicate, eccetera.). Per la maggior parte dei casi specifici, puoi provare a implementare un'interpretazione astratta globale per approssimare tutti i possibili percorsi di flusso di dati per i tuoi indicatori. Non sarebbe accurato, ovviamente, ma poi otterrai almeno un'approssimazione prudente.

+2

Realmente non si vuole produrre un punto calligrafico per 8 milioni di righe di codice. Coprirebbe un campo da tennis, se il punto potrebbe disegnarlo, cosa che non può. Oltre a ciò, questa è una grande eco della risposta all'altra domanda di OP: -} con particolare enfasi su quali sono i divertenti indicatori di funzione. –

+0

@IraBaxter, certamente non vuoi * visualizzare * un punto calligrafico per qualcosa di più grande di "ciao, mondo!". Ma potresti voler usare quel file .dot per ulteriori analisi. Di solito analizzo i file .dot e li memorizzo in un database. –

+0

Grazie per aver segnalato lo strumento 'opt'. Sì, Ira, non sto cercando di generare una rappresentazione grafica del grafo delle chiamate. Averlo in qualsiasi formato parsable è OK, che qualifica il formato del punto. Per quanto riguarda i puntatori di funzione, mi è stato detto che LLVM dovrebbe essere in grado di fare alcuni di quei punti: analisi per i puntatori di funzione. Non sto cercando di implementarlo da solo, chiaramente. – addalbx

Problemi correlati