2010-11-09 8 views
6

add2.c:Cosa significa "COM" nella colonna Ndx della sezione .symtab?

int counter=0; 
int a=0; 
int b; 
int c; 
int add(int a, int b) { 
    return a+b; 
} 

compilazione: gcc -c add2.c -o add2.o

leggere la tabella dei simboli: --symbols readelf add2.o

Symbol table '.symtab' contains 12 entries: 
    Num: Value Size Type Bind Vis  Ndx Name 
    0: 00000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 00000000  0 FILE LOCAL DEFAULT ABS add2.c 
    2: 00000000  0 SECTION LOCAL DEFAULT 1 
    3: 00000000  0 SECTION LOCAL DEFAULT 2 
    4: 00000000  0 SECTION LOCAL DEFAULT 3 
    5: 00000000  0 SECTION LOCAL DEFAULT 5 
    6: 00000000  0 SECTION LOCAL DEFAULT 4 
    7: 00000000  4 OBJECT GLOBAL DEFAULT 3 counter 
    8: 00000004  4 OBJECT GLOBAL DEFAULT 3 a 
    9: 00000004  4 OBJECT GLOBAL DEFAULT COM b 
    10: 00000004  4 OBJECT GLOBAL DEFAULT COM c 
    11: 00000000 14 FUNC GLOBAL DEFAULT 1 add 

Cosa significa "COM" nella colonna Ndx? Capisco che "counter" e "a" sono definiti nella sezione # 3 (cioè, .bss) e che "add" è definito nella sezione # 1 (cioè, .text), ma mi aspettavo "b" e "c" deve essere definito anche nella sezione .bss, quindi ottieni un "3" nella colonna Ndx.

si

risposta

5

gcc tratta globali non inizializzati che non sono esplicitamente dichiarati extern come simboli "comuni" (quindi "COM").

Più definizioni dello stesso simbolo comune (su più file oggetto) vengono unite dal linker durante la creazione dell'eseguibile finale, in modo che si riferiscano tutte alla stessa memoria. Uno dei file oggetto può inizializzarlo su un valore particolare (nel qual caso finirà nella sezione dati); se nessun file oggetto lo inizializza, finirà nel BSS; se più di un oggetto lo inizializza, otterrai un errore del linker.

In sintesi, se avete, diciamo, due definizioni di int a:

  • int a; in un oggetto e int a; in un altro oggetto è OK: entrambe si riferiscono alla stessa a, inizializzato a 0
  • int a; in un oggetto e int a = 42; in un altro oggetto è OK: entrambi si riferiscono allo stesso a, inizializzato a 42
  • int a = 23; in un oggetto e int a= 42; in un altro oggetto wi Fornirò un errore di collegamento.

Si noti che l'uso di più definizioni dello stesso simbolo su due oggetti non è tecnicamente consentito dallo standard C; ma è supportato da molti compilatori, incluso gcc, come estensione. (È elencato sotto "Estensioni comuni" - nessun gioco di parole previsto - nelle specifiche C99.)

+0

Ok! Capisco che non possiamo ora dove un simbolo "COMUNE" finirà per cercare un file oggetto rilocabile. Questo è deciso dal linker, al momento del link, in funzione di ciò che altri file oggetto rilocabili fanno con questo simbolo. È giusto ? – user368507

+0

Sì, è vero. –

2

Grazie da this PDF, tabella 7-11:

SHN_COMMON
simboli definita rispetto a questa sezione sono simboli comuni, come come COMMON o C non assegnata variabili esterne FORTRAN. Questi simboli sono a volte indicati come provvisori.

Vedere anche this page.

+0

Il collegamento al PDF è ora morto. –

+0

@PiotrZierhoffer: collegamento fisso. – user200783

0

Sono variabili globali non inizializzate assegnate dal linker. A volte indicati come variabili comuni.

Modifica: Hrmm, Paul Baker mi ha battuto su di esso, con collegamenti non meno. usa la sua risposta :)

Problemi correlati