Linking

Da Wikipedia, l'enciclopedia libera.

Il linking (letteralmente "collegamento")[1] è 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 programma oggetto, cioè la traduzione del codice sorgente in linguaggio macchina, e le librerie del linguaggio necessarie per l'esecuzione del programma.

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[modifica | modifica sorgente]

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 che 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 è una 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)[modifica | modifica sorgente]

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.

Note[modifica | modifica sorgente]

  1. ^ Per quanto alcuni testi e autori in lingua italiana abbiano scelto di tradurre il termine, quest'ultimo è di uso molto infrequente.

Bibliografia[modifica | modifica sorgente]

  • David William Barron, Assemblers and Loaders. 1972, Elsevier.
  • C. W. Fraser and D. R. Hanson, A Machine Independent Linker. Software-Practice and Experience 12, 4 (April 1982).
  • IBM Corporation, Operating System 360, Linkage Editor, Program Logic Manual, 1967 [1]
  • D.W. Jones, Assembly Language as Object Code. Software-Practice and Experience 13, 8 (August 1983)
  • John R. Levine: Linkers and Loaders, Morgan-Kauffman, ISBN 1-55860-496-0
  • Leon Presser, John R. White: Linkers and Loaders. ACM Computing Surveys, Volume 4, Number 3, September 1972, pp.149-167 [2]
  • Norman Ramsey, Relocating Machine Instructions by Currying. (1996) [3]
  • David Salomon, Assemblers and Loaders. 1993 [4]

Voci correlate[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]

Informatica Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica