title: GNU linker
text: # GNU linker
  
  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".
  
  ## Descrizione
  
  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.
  
  ## Linker script
  
  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).
  
  Quello che segue è un possibile semplice esempio di linker script.
  
  