2010-04-15 12 views
6

Per variabili globali in C comeCome inizializzare le variabili globali dal caricatore elf

int aglobal = 5;

Quando i 5 vengono trasferiti in aglobal dal caricatore e come fa a mettere 5 in aglobal.

Stessa situazione con una dichiarazione statica in una funzione. Mi piace

int afunc() { statico int astatico = 8; ritorno astatico; }

risposta

6

Uno spazio int-sized viene creato in una sezione dati, con il valore 5 codificato in esso e un simbolo globale non funzione denominato "aglobal" viene aggiunto alla tabella dei simboli che punta su di esso. I riferimenti ai aglobal si trasformano in delocalizzazioni che si risolvono in collegamento in tempo per puntare a quel blocco di dati, quindi in un'immagine completamente legato istruzioni vengono caricati direttamente da quel punto in memoria che contiene il 5 valore

Ad esempio, il (x86) assemblaggio potrebbe essere simile:

.data 
.globl aglobal 
aglobal: .long 5 

.text 
main: 
    mov eax, aglobal 

in un file oggetto, l'istruzione mov si trasformerà in mov eax, 0 con una delocalizzazione R_386_32 aglobal+0, perché il file oggetto non sa con certezza dove la sezione dei dati sarà in memoria.

In un'immagine completamente collegata, potrebbe essere qualcosa di simile:

mov eax, 0x804a010 

Ora l'indirizzo effettivo dei 4 byte nella sezione dati è nota, quindi è specificato direttamente

+0

Grazie questo aiuta. Correggetemi se ho torto ... Quindi se si legge o scrive su aglobal nel mio codice si accede alla sezione .data. La sezione .data viene inizializzata dal loader copiando la sezione .data dal file elf in memoria. – newguy

+0

A destra, la sezione dati viene caricata in memoria proprio come la sezione di testo (ma generalmente non è eseguibile e il testo non è scrivibile, per cercare di prevenire gli exploit). Al momento del collegamento, viene determinata la posizione in cui si trova la parola specifica nella sezione dei dati e tutte le istruzioni che fanno riferimento (avranno un riposizionamento con il nome 'aglobal') vengono corrette fino a quel punto. Tutto ciò che il caricatore deve fare è spostare l'intera immagine dal suo indirizzo di base all'indirizzo in cui viene effettivamente caricato in memoria (molte immagini hanno un indirizzo base di 0, quindi aggiunge solo l'indirizzo di memoria iniziale) –

+0

Grazie. Apprezzo l'aiuto Mike. – newguy