2010-01-26 10 views
15

C'è un modo — molto simile alla visualizzazione del risultato della preelaborazione con gcc -E — per vedere come sono fatti i miei oggetti una volta compilati in file oggetto?Layout di oggetti compilati

Sto parlando di GCC, ma una soluzione che includa MSVC andrebbe bene.

+2

vuoi dire codice o dati? –

+0

Buon punto John. Il costruttore sarà codice, e come tutto il codice appartiene alla classe, non singoli oggetti. Quindi non lo troverai nel layout dell'oggetto. – MSalters

+1

È possibile utilizzare 'g ++ -S file.cpp' per ottenere l'output dell'assembler in' file.s'. È questo che vuoi? – msandiford

risposta

0

I file oggetto contengono dati binari - l'unico livello superiore che la maggior parte dei compilatori può produrre è assemblatore, quindi se non riesci a leggere non sei fortunato. Tuttavia, dai un'occhiata a this question per maggiori informazioni in quest'area.

0

È possibile controllare il layout dei file binari e il loro contenuto utilizzando i file di mappa. Utilizzare /MAP per VC e -Map o --print-map per gcc.

0

La tua domanda è un po 'confusa.

Se si desidera visualizzare il risultato della preelaborazione con MSVC, è possibile utilizzare /E, /P/ o /EP.

C'è un'opzione non documentata in MSVC per mostrare il layout dei dati di strutture e classi. Ho problemi a trovarlo adesso.

+0

> C'è un'opzione non documentata in MSVC per mostrare il layout dei dati di strutture e classi. Ho problemi a trovarlo adesso. questo è esattamente quello che sto cercando! – user257620

+2

Finalmente sono riuscito a recuperare questi parametri: '/ d1reportSingleClassLayoutXXX' e'/d1reportAllClassLayout'. –

5

Per gli eseguibili compilati GCC, checkout Pahole. Ti mostrerà come il compilatore ha disposto le tue strutture/classi e se hanno o meno dei "buchi" in esse. I fori sono il riempimento dovuto alle regole di allineamento della memoria.

+1

(+1) strumento naice –

+1

il collegamento pahole è morto – ofloveandhate

+0

@ofloveandhate Ho risolto il collegamento. – paxos1977

0

Un costruttore è solo un'altra funzione (a meno che non sia allineata). I file oggetto contengono molte informazioni per il linker; quindi dovresti essere in grado di trovare la funzione nel file .a (i nomi delle funzioni saranno però stravolti).

19

Per Visual C++:

finalmente sono riuscita a scavare le bandiere (ben nascosto!) Compilatore non documentati che MSVC++ supporta l'utilizzo di informazioni provenienti da here e here. Eccoli:

/d1reportSingleClassLayoutXXX 
/d1reportAllClassLayout 

(sostituzione XXX con il nome della classe)

Problemi correlati