2012-06-25 14 views
11

C'è questa uscita di objdump su alcuni file oggetto:Bandiere in uscita objdump di file oggetto

$ objdump -h main.o 

main.o:  file format elf32-i386 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   0000000b 00000000 00000000 00000034 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    1 .data   00000000 00000000 00000000 00000040 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
    2 .bss   00000000 00000000 00000000 00000040 2**2 
        ALLOC 
    3 .note.GNU-stack 00000000 00000000 00000000 00000040 2**0 
        CONTENTS, READONLY, CODE 

Che cosa significano queste bandiere CONTENUTO, ALLOC, carico e così via significa?

risposta

20

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.

+0

il collegamento n. 2 è ora rotto. :( –

+0

Peccato, anzi. –

+0

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 –

4

pezzi trovati di informazioni su Ubuntu elf man page e questo è solo la mia comprensione.
Penso che siano le informazioni sia dal program header e section header.

LOAD: may correspond to PT_LOAD in the Program header table. Brief description: 
It specifies the type of that particular element in the program header table. 
The array element specifies a loadable segment 

ALLOC: may correspond to SHF_ALLOC in the section table. Brief description: 
Its specifies the flag of that particular element in the section header. 
This section occupies memory during process execution. 

CODE/ DATA: indicates the belonging segment 

READONLY: specifies a read-only segment 

CONTENTS: I didn't find anything to conclude. 

Spero che questo aiuti