Sto cercando di capire di più sulla sezione "comune" di un eseguibile e ho notato che quando si esegue uno objdump
su un codice compilato, posso vedere le variabili inserite nel codice comune solo sui file oggetto (*.o
) non sugli eseguibili.Perché le variabili di sezione comuni vengono visualizzate solo nel file oggetto e non nell'eseguibile?
Perché è quello?
//test.c
int i[1000];
int main(){return 0;}
comando build:
> gcc -g0 -fcommon -c test.c
> gcc -g0 -fcommon test.c
objdump
mostra i
nella sezione comune nella tabella dei simboli:
> objdump -x test.o
...
SYMBOL TABLE:
...
00000fa0 O *COM* 00000020 i
A meno che non lo faccio funzionare sul file eseguibile:
> objdump -x a.out
...
SYMBOL TABLE:
...
0804a040 g O .bss 00000fa0 i
Se ricostruisco il file oggetto con il flag -fno-common
, viene invece visualizzato nel segmento .bss
proprio come nell'eseguibile. Il file eseguibile finale non ha questa sezione "COMUNE"?
ok ... allora qual è il punto della sezione comune, allora?con sia 'fcommon' che' fno-common' il risultato finale è che le variabili non inizializzate finiscono nel segmento .bss dell'eseguibile; o esiste per la stessa ragione per cui hai scritto '" [a typical] "'? il che significa che ci sono delle eccezioni – Mike
@Mike Ma il compilatore non lo sa - è il lavoro dei linker per capirlo. Con target (e formati eseguibili) che forniscono una sezione .bss, la sezione bss viene normalmente allocata e inizializzata in fase di runtime. Sugli obiettivi che non hanno questa capacità, le sezioni comuni finiscono nell'eseguibile, e se si dispone di un array globale di 10Mb, il tuo eseguibile finisce per essere grande 10Mb. Ciò consente anche di scrivere i propri script di linker e posizionare quelle sezioni comuni dove li si desidera. -fno-comune ha altri usi, che però spiega la pagina man di gcc. – nos
Ho detto "un tipico" perché è possibile aggiungere sezioni aggiuntive in alcune architetture e queste sezioni possono essere assegnate anche a tutti i tipi di attributi. Non tutti i compilatori, i linker, ecc. Lo supporteranno, e 'gcc' è in grado di girare su un gran numero di sistemi, con un gran numero di architetture del sistema operativo. Non volevo che qualcuno facesse notare che su OS glurf, con il linker X, hai sezioni chiamate ..., ecc. –