Il core dump è solo il dump dell'impronta di memoria dei tuoi programmi, se sai dove si trovava tutto, puoi semplicemente usarlo.
Si utilizza l'eseguibile perché spiega dove (in termini di indirizzi logici) le cose si trovano in memoria, cioè il file principale.
Se si utilizza un comando objdump
, verranno scaricati i metadati sull'oggetto eseguibile che si sta esaminando. Utilizzando un oggetto eseguibile chiamato a.out come esempio.
objdump -h a.out
scarica solo le informazioni dell'intestazione, vedrai le sezioni chiamate ad es. .data o .bss o .text (ce ne sono molti altri). Questi informano il caricatore del kernel dove nell'oggetto possono essere trovate varie sezioni e dove nello spazio degli indirizzi di processo la sezione dovrebbe essere caricata, e per alcune sezioni (es. .Data .text) cosa dovrebbe essere caricato. (la sezione .bss non contiene alcun dato nel file ma fa riferimento alla quantità di memoria da riservare nel processo per i dati non inizializzati, è piena di zeri).
Il layout del file oggetto eseguibile è conforme a un ELF standard.
objdump -x a.out
- scarica tutto
Se l'oggetto eseguibile contiene ancora le sue tabelle dei simboli (non è stato rimosso - man strip
e hai usato -g
per generare la generazione di debug gcc
assumendo la compilazione della fonte ac), allora puoi esaminare il contenuto principale con i nomi dei simboli, ad esempio se avevi una variabile / buffer chiamato inputLine nel codice sorgente, è possibile utilizzare quel nome gdb
per visualizzarne il contenuto. vale a dire gdb
conoscere l'offset dall'inizio del programma inizializzato il segmento di dati in cui inizia inputLine e la lunghezza di quella variabile.
Ulteriori letture articolo 1 ,
articolo 2 e per la specifica grintosa Executable and Linking Format (ELF) .
Aggiornamento dopo il commento @mirabilos di seguito.
Ma se si utilizza la tabella dei simboli come in
$ gdb --batch -s a.out -c core -q -ex "x buf1"
produce
0x601060 <buf1>: 0x72617453
e quindi non usando la tabella dei simboli e esaminando l'indirizzo direttamente in,
$ gdb --batch -c core -q -ex "x 0x601060"
produce
0x601060: 0x72617453
Ho esaminato la memoria direttamente senza usare la tabella dei simboli nel 2 ° comando.
Vedo anche che la risposta di @ user580082 aggiunge ulteriore spiegazione e voterà.