Quello che si vede è l'interpretazione della combinazione di bandiere segmento ELF, tipo di sezione e bandiere sezione per ogni sezione del file oggetto.
LOAD
significa che la sezione risiede in un segmento caricabile, vale a dire il suo contenuto potrebbe essere letto dal file in memoria quando si crea un processo
bandiere delle sezioni sono ben documentati nella Chapter 4 del Sistema V Applicazione interfaccia binaria, anche se con nomi leggermente diversi da quello che mostra objdump
.
CODE
significa che la sezione contiene codice eseguibile; è indicato con il flag SHF_EXECINSTR
nell'intestazione sezione
DATA
significa che la sezione non è eseguibile ma è scrivibile, indicato dalla presenza del SHF_WRITE
bandiera
READONLY
significa che la sezione non è né eseguibile né writtable e dovrebbe essere posto in pagine di memoria di sola lettura
ALLOC
significa che la sezione occupa memoria, ad esempio le pagine di memoria sono effettivamente allocate per contenere il contenuto della sezione quando viene creato un processo, indicato dal flag SHF_ALLOC
. Alcune sezioni, ad es. quelli che contengono informazioni di debug, non vengono letti in memoria durante la normale esecuzione del programma e non sono contrassegnati come ALLOC
per risparmiare memoria.
Sezioni di tipo SHT_PROGBITS
hanno un contenuto corrispondente nel file e sono mostrati come CONTENTS
. Alcune sezioni non hanno il contenuto corrispondente nel file, ad es. la sezione .bss
, che è di tipo SHT_NOBITS
.
La sezione .text
contiene il codice di programma eseguibile. È visualizzato come CONTENTS
poiché è di tipo SHT_PROGBITS
. La memoria deve essere riservata per questa sezione poiché è ALLOC
e il suo contenuto deve essere caricato dal file poiché è collocato in un segmento LOAD
-able. Il codice del programma è generalmente non modificabile e quindi la sezione viene inserita nella memoria di sola lettura. Contiene istruzioni che devono essere eseguite e quindi il flag CODE
.
Le variabili inizializzate vanno nella sezione .data
. I loro valori iniziali sono memorizzati nel file e letti da lì mentre il processo viene creato.In C/C++ si tratta di variabili globali, variabili locali statiche e variabili membro statiche C++ inizializzate in modo appropriato, ad es. static int a = 10;
. Fortran posti inizializzati SAVE
-d variabili e blocchi COMMON
, che sono indicati con valore iniziale con un blocco DATA
dichiarazione lì.
La sezione .bss
(nome storico, abbreviazione di Blocco avviato da Symbol) è la più semplice. Detiene le variabili non inizializzate con classe di archiviazione statica. È una sezione di tipo SHT_NOBITS
e non occupa spazio nel file. La memoria è ALLOC
-ated per questo, ma non viene letto nulla dal file per prepopolare la memoria - rimane semplicemente tutti gli zero consegnati dall'allocatore di memoria del kernel.
Costanti di solito andare nella sezione .rodata
(non presente nel tuo esempio), che si presenta come .data
ma non è contrassegnato come scrivibile ed è quindi indicato come READONLY
.
fonte
2012-06-25 20:43:46
il collegamento n. 2 è ora rotto. :( –
Peccato, anzi. –
Ho provato a eseguire objdump -h su un file rilocabile (file .oo raw, cioè un file senza intestazioni di programma), e ha ancora elencato sezioni (es. .text) con l'attributo LOAD. non mi è chiaro quale sia la differenza tra LOAD e ALLOC. Forse è solo LOAD = ALLOC && CONTENTS –