GNU linker

implementazione del linker ld nel Progetto GNU
GNU linker
software
Logo
Generelinker (non in lista)
SviluppatoreProgetto GNU
Ultima versionetoolset version of binutils
Sistema operativoMultipiattaforma
LinguaggioC
LicenzaGNU GPL v3+
(licenza libera)

GNU linker (o GNU ld) è l'implementazione GNU del comando Unix ld, parte delle GNU Binary Utilities (binutils) e distribuito sotto licenza GNU GPL. Il nome "ld" deriva probabilmente da "LoaD" o da "Link eDitor".

DescrizioneModifica

Si tratta di un linker, ovvero un programma che crea un file eseguibile o una libreria a partire da codice oggetto, tipicamente l'output di un compilatore. Il linker ld può essere chiamato implicitamente anche da altri comandi, ad esempio quando si compila un file sorgente C con GCC, l'output viene di solito collegato automaticamente alle librerie usando ld. Un linker script può essere usato, passandolo come parametro, per definire manualmente come operare il linking.[1]

Linker scriptModifica

Un linker script è un insieme di comandi che definiscono quali parti di codice oggetto copiare e in quale ordine. I principali tra essi sono SECTIONS (fondamentale, specifica la struttura del file binario in output) e MEMORY (opzionale, che descrive la memoria disponibile). I commenti, sintatticamente equivalenti a del whitespace e delimitati da /* e */, sono analoghi a quelli in C89. La variabile speciale '.' (location counter) permette di specificare la posizione corrente in memoria nella quale inserire il codice oggetto. La sintassi mette a disposizione diversi operatori aritmetici e alcune funzioni con cui costruire espressioni.

Il comando SECTIONS può essere usato una sola volta in ogni script, e permette di definire un numero arbitrario di sezioni. Ogni sezione ha un nome, seguito da due punti e un blocco tra parentesi graffe che ne definisce il contenuto. Il contenuto è dato dai file specificati, dei quali eventualmente possono essere copiate solo determinate sezioni (indicate tra parentesi tonde), mentre la stella di Kleene indica tutti i file disponibili. Possono essere inoltre specificati una serie di attributi opzionali (allineamento, valore da usare per riempire le parti vuote della sezione etc.).

Il comando MEMORY consente di definire posizione e dimensione dei blocchi di memoria usati (facoltativamente, l'impostazione predefinita usa tutta la memoria disponibile). Anche questo comando può essere usato solo una volta, ma permette di definire un numero arbitrario di blocchi, caratterizzati da un nome, da una lista di attributi opzionali (presenti per compatibilità con il linker AT&T), inizio del blocco (ORIGIN, abbreviato org oppure o) e la sua lunghezza (LENGTH, len oppure l).

Il comando ENTRY definisce il punto d'ingresso dell'applicazione, ovvero la prima istruzione da eseguire. Può essere specificato nello script, oppure può essere usato in sua assenza il valore della variabile start (che permette quindi un entry point parametrico) oppure un valore passato da riga di comando (che ha sempre la precedenza, quando presente). In mancanza di altre indicazioni, vengono usati come entry point il primo byte della sezione text oppure, come estrema risorsa, l'indirizzo 0.

Oltre a questi tre comandi principali, è disponibile un insieme di altri comandi che permettono di definire ulteriori dettagli (architettura, formato del codice oggetto, path delle librerie e altro).[2]

Quello che segue è un possibile semplice esempio di linker script.

OUTPUT_FORMAT("elf32-i386")

SECTIONS /* definisce le sezioni */
{
    . = 0x00000000; /* imposta location counter a zero */

    .text: /* sezione text */
    {
         boot.o (.text) /* copia la sezione text del file boot.o */
         interrupts.o (.text) /* idem per il file interrupts.o */
         * (.text) /* sezione text di tutti gli altri file */
    }

    .data 0x00000800: /* sezione data, inizia alla posizione 0x00000800 */
    {
        * (.data)
    }

    . += 0x1000; /* avanza location counter di 4 kiB */
    .bss: /* sezione dati non inizializzati */
    {
        * (.bss)
    }
}

MEMORY /* definisce la memoria del target */
{
    rom : ORIGIN = 0, LENGTH = 512K /* blocco di nome rom, origine in zero e lungo 512 kiB */
    ram : org = 0x40000000, l = 16M /* blocco ram, origine in 0x40000000 e lungo 16 MiB */
}

NoteModifica

Voci correlateModifica

Collegamenti esterniModifica

  Portale Software libero: accedi alle voci di Wikipedia che trattano di software libero