2013-05-05 21 views
9

Sono nuovo all'assemblaggio e quindi voglio capire di più sul concetto di delocalizzazione.Che cosa significa il concetto di trasferimento?

  1. Perché esattamente dobbiamo spostare i programmi, i dati?
  2. Come è fatto esattamente?

Sarebbe bello se qualcuno potesse spiegare con un esempio di livello principiante.

+0

http://stackoverflow.com/questions/6002359/so-most-of-the-binary-is-composed-of-reloc-table/6092773#6092773 – JosephH

+0

Qual è il tuo problema pratico di programmazione? Il tuo programma non è in esecuzione a causa di un problema con le delocalizzazioni? –

+0

Esempio minimo dettagliato: http://stackoverflow.com/a/30507725/895245 –

risposta

12

L'assemblatore ha un file sorgente da guardare. Deve costruire un'immagine di memoria basata su quell'unico file sorgente. Quindi inizia con 0 per il codice e anche per 0 con i dati. I risultati vanno in un file oggetto.

Ora, il linker arriva e deve combinare molti file oggetto in un eseguibile (o immagine del kernel, o qualsiasi altra cosa). Non può lasciare tutti a 0, si sovrapporrebbe. Quindi deve riposizionare gli indirizzi per assegnare il valore di ciascun file oggetto a un intervallo univoco.

Quindi, l'immagine viene caricata nella memoria virtuale, il sistema operativo può avere buoni motivi per voler utilizzare un indirizzo diverso da "0" come indirizzo virtuale di base. Quindi, in fase di runtime, vuole riposizionare di nuovo tutto.

Infine, se sono coinvolte librerie condivise, né l'assemblatore né il linker sanno dove si troveranno nell'ambiente di esecuzione, e quindi i riferimenti ad essi devono essere riposizionati.