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
fonte
2010-04-15 22:18:26
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
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) –
Grazie. Apprezzo l'aiuto Mike. – newguy