# Linking

Il linking (lett. "collegamento"), in informatica, è il procedimento di integrazione dei vari moduli a cui un programma fa riferimento (i quali possono essere sottoprogrammi o librerie), per creare una singola unità eseguibile. Il linker (o link editor) è un programma che effettua il collegamento tra il codice oggetto, cioè la traduzione del codice sorgente in linguaggio macchina, e le librerie del linguaggio necessarie per l'esecuzione del programma (API, Application programming interface).
Nei mainframe IBM come gli OS/360 questo programma è chiamato linkage editor. Nelle varianti di Unix è spesso usato anche il termine loader come sinonimo di linker. A causa di questa confusione terminologica tra il processo a compile-time e quello a run-time, questa voce userà linker per il primo e loading per il secondo.

## Funzionamento

I codici oggetto sono parti di programma contenenti sia codice macchina che informazioni per il linker. Questa informazione è costituita principalmente nella forma di definizioni di simboli, che sono di due tipi:
* I simboli definiti o esportati sono simboli che rappresentano quelle funzioni o quelle variabili che sono presenti nel modulo (quindi nel relativo codice oggetto), e che vengono rese disponibili per essere utilizzate da parte di altri moduli.
* I simboli non definiti né importati rappresentano funzioni che vengono chiamate, o variabili che vengono referenziate, nell'oggetto presente, e tuttavia non sono definite internamente, bensì sono definite in altri moduli.
Il lavoro del linker consiste nel risolvere i collegamenti ai simboli non definiti, trovando quale altro modulo li definisce; e quindi nel rimpiazzare ciascun segnaposto con l'effettivo indirizzo del simbolo.
Un insieme di moduli software pronti per essere utilizzati da altri programmi viene chiamato "libreria". Una libreria è quindi un insieme di moduli (in forma di codici-oggetto) raccolti in un unico file contenitore. I linker possono utilizzare i moduli software contenuti nelle librerie. Alcuni linker non includono l'intera libreria nel programma di output, ma solo le parti che si rendono necessarie perché referenziate da altro codice oggetto o altre librerie. Esistono librerie per svariati scopi (esempi: interazione con l'hardware, calcolo matematico); tipicamente, le librerie più comuni sono utilizzate automaticamente in modo implicito, mentre quelle più specializzate devono essere indicate esplicitamente dal programmatore.
Il linker si occupa anche di distribuire il software (codice oggetto) nello spazio di indirizzi del programma. Questo può richiedere lo spostamento di codice da un certo indirizzo base ad un altro; questa è un'operazione importante perché spostare un segmento di codice da un indirizzo ad un altro richiede di ricalcolare e modificare tutti gli indirizzi che puntano a quel codice. Poiché normalmente il compilatore non sa dove (in quale indirizzo di memoria) risiederà il codice relativo a un particolare modulo, il compilatore ipotizza un indirizzo fisso (ad esempio zero), che dovrà poi essere modificato nel momento in cui tutti i moduli vengono combinati in un codice eseguibile unico. Spostare un segmento di codice da un indirizzo ad un altro viene chiamato "rilocazione" e può richiedere il ricalcolo degli indirizzi utilizzati nelle istruzioni di salto assoluto o nelle istruzioni di caricamento o salvataggio di dato in memoria.
Il programma eseguibile prodotto dal linker potrebbe richiedere un'ulteriore rilocazione quando il programma viene caricato in memoria (appena prima della sua esecuzione). Questa operazione non è necessaria nei computer che dispongono di un sistema di memoria virtuale; in questi computer ogni programma ha a disposizione un proprio spazio di indirizzamento privato. Nei sistemi a memoria virtuale tutti i programmi utilizzano lo stesso indirizzo base senza che ci siano conflitti tra programmi diversi

## Collegamento dinamico (Dynamic linking)

I sistemi operativi moderni prevedono il dynamic linking, ossia la risoluzione di simboli non definiti rimandata fino a che il programma non è in esecuzione. Questo significa che l'eseguibile contiene simboli non definiti e una lista degli oggetti o librerie che ne possono fornire la definizione. Lanciando il programma per l'esecuzione vengono caricati questi oggetti / librerie e si stabilisce il collegamento finale. Questa modalità di esecuzione offre due vantaggi:
* Le librerie molto usate (come ad esempio quelle standard di sistema) possono essere memorizzate in una sola locazione, e non duplicate ad ogni richiesta;
* Se viene aggiornata e rimpiazzata una libreria di funzioni, tutti i programmi che la usano dinamicamente beneficiano dell'aggiornamento appena vengono rieseguiti. Al contrario, i programmi che includono tali funzioni con collegamento statico devono essere sottoposti ad un nuovo passaggio di linkage editor / loader.