|
 |
Gli strumenti di Lavoro |
LINKER 9/10
[45 di 87] |
 |
|
Quali
sono gli errori di collegamento più frequenti? |
|
 | Nel corso degli esempi di questo paragrafo
abbiamo spesso citato l'errore
LINK : warning L4021: no stack segment,
tipico dell'azione del Linker sugli
oggetti (OBJ) ottenuti a partire da un
sorgente organizzato per generare, alla fine, un programma di tipo
COM:
 | La segnalazione è sacrosanta perchè
questi sorgenti definiscono solo un segmento
(quello di codice, indicato con _prog,
nei nostri esempi) nel quale, per la natura intrasegmentale dei files
COM, viene a trovarsi ogni componente funzionale di un eseguibile, compreso
lo stack (ne riparleremo nelle pagine del paragrafo Exe2Bin). |
 | la segnalazione è dunque ovvia: il
segmento di stack non c'è proprio! Del resto si tratta di un errore warning
e può quindi essere tranquillamente
ignorato. |
|
 | Un altro errore che possiamo osservare con una
certa frequenza,
LINK : error L2029: Unresolved externals::
 | è dovuto all'inesatta formulazione del
comando LINK; abbiamo già suggerito
come
si deve dare inizio al
collegamento degli oggetti chiamati a formare l'eseguibile EXE,
ma spesso per inesperienza dimentichiamo
di specificare il nome della libreria nella
quale il Linker deve cercare le
procedure dichiarate EXTRN
nel programma sorgente. |
 | di solito dopo la segnalazione segue
l'elenco dettagliato di tutte le etichette
(di procedure) esterne non risolte,
chiuso dal numero consuntivo degli errori commessi:
C:\Arch-Lab\Lavoro>link
prova2.exe
Microsoft (R) Overlay Linker Version 3.64
Copyright (C) Microsoft Corp 1983-1988. All rights reserved.
Run File [PROVA2.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment
LINK : error L2029: Unresolved externals:
VIA_CUR in file(s):
PROVA2.OBJ(PROVA2.ASM)
BIOSCLS in file(s):
PROVA2.OBJ(PROVA2.ASM)
There were 2 errors detected |
|
 | Per prevenire questo errore è bene
abituarsi a dare un comando di collegamento del tipo:
| LINK
prova,prova,nul,Giobe.Lib /NOE |
|
|
 | Se si tenta di collegare oggetti non presenti,
per esempio perchè un precedente errore di compilazione non ha permesso la
creazione dell'OBJ, il Linker da il
seguente errore: LINK: fatal error L1093:
PROVA2.OBJ: object not found. |
 | Una segnalazione d'errore non molto frequente
ma che genera panico perchè è piuttosto difficile da correggere è la
seguente: fixup offset
exceeds field width; si presenta:
 | quando il programma sorgente dichiara una
procedura EXTRN di tipo NEAR
e la libreria che la definisce la dichiara FAR;
l'uso delle matrici
preconfezionate e della
libreria Giobe.LIB rende impossibile
questa segnalazione (almeno per questa causa): sia le
dichiarazioni interne (in libreria) che quelle esterne (nel sorgente)
sono implicitamente di tipo NEAR. |
 | l'errore può essere segnalato anche se il
codice macchina del nostro eseguibile ha superato la dimensione massima
di 64k (superamento dell'ampiezza del campo)
e nei nostri programmi la cosa è senz'altro da escludere! |
|
 | Per finire mostriamo un errore simile al
precedente, poco probabile nelle nostre esperienze future, dovuto alla cattiva
gestione delle etichette di un programma; nel caso specifico
la variabile ATTRIB è stata
definita in un segmento specifico per dati (in una struttura EXE),
ma la libreria, linkata all'oggetto così generato da MASM,
da per scontato che la variabile sia nel segmento di codice, _prog;
notare come il Linker si sforzi di dare
la maggior quantità possibile di informazioni sull'errore (ben 3 righe):
C:\Arch-Lab\Lavoro>link
prova2.exe
Microsoft (R) Overlay Linker Version 3.64
Copyright (C) Microsoft Corp 1983-1988. All rights reserved.
Run File [PROVA2.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]: giobe
GIOBE.LIB(bios08.ASM) : error L2002: fixup overflow at 0011 in segment _PROG
pos: E80 Record type: 48dotto
target external 'ATTRIB'
There were 1 errors detected |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|