Linking
Da Wikipedia, l'enciclopedia libera.
Il Linking (collegamento) è 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 prende uno o più oggetti generati dai compilatori e li assembla in un unico programma eseguibile.
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)
Indice |
[modifica] 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 è 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 puo' 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 delle 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
[modifica] 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.
[modifica] Bibliografia
- 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]
[modifica] Collegamenti esterni
- Manuscript Chapters of the book 'Linkers and Loaders' by John R. Levine
- Linkers and Loaders by Sandeep Grover
- Comparison of Free Linkers
- A Listing of Other Useful Tools that includes linkers
- Another Listing of Where to Get a Complete Collection of Free Tools for Assembly Language Development
- Linker and Libraries Guide. Sun Microsystems Inc.
- GoLink: a free linker for Windows programming
[modifica] Voci correlate
Portale Informatica: accedi alle voci di Wikipedia che parlano di Informatica