Schau, der Compiler (Assembler) fährt ja durch den Source-Code (Text) durch und kommt zu sowas wie "CALL WTLBRNFT". Er braucht an dieser Stelle aber offensichtlich eine Addresse, um den Maschinen Code herzurichten. Wo nimmt er die jetzt her ? Er merkt sich die Stelle und fährt auch durch den restlichen Code durch (Pass 1, vielleicht schon gehört). Findet er nun unterwegs einen Label "WTLBRNFT" , schreibt er sich diese Adresse auf.
Dann fährt er nochmal durch den ganzen Code (Pass 2). Wenn er nun zu dem CALL kommt, geht's ihm gut, denn jetzt hat er ja die Adresse und kann das Statement fix und foxi in Maschinencode übersetzen.
Jetzt hat er EIN Object-Modul fertig. voila.
Ist aber nun "WTLBRNFT" eine Label, der in einer ANDEREN Source des Projektes definiert wird (und daher auch in einem anderen Object-Modul),
geht das obige nicht. Damit der Compiler aber weiß, daß "WTLBRNFT" kein Schreibfehler ist, sondern nur woanders definiert ist, schreibt man "EXTERN WTLBRNFT" rein. Deswegen kann er das statement zwar auch nicht übersetzen (er hat ja die Adresse immer noch nicht), aber er schreibt in das Object Modul eine Nachricht für den Linker, daß "WTLBRNFT" noch eine Adresse braucht und WO im dem Object diese Adresse überall fehlt (kann ja öfters drinstehen)
So.
Jetzt kommt der Linker daher und ist verzweifelt. Er sieht, daß er die Adresse von WTLBRNFT braucht und hat keine Ahnung, in welchen Objectmodule die sein könnte.
Wenn aber der Programmierer, der diese Funktion tatsächlich geschrieben hat, zusätzlich "GLOBAL WTLBRNFT" in die Source geschrieben hat, steht vorne im Objectmodul eine Zeile mit Namen und Adresse von dem Label.
JETZT ist der Linker glücklich, denn überall, wo der Wert fehlt, kann er jetzt was reinschreiben und alle freuen sich.
ALSO: der, der eine Funktion SCHREIBT, kann zusätzlich "GLOBAL" dazu sagen, dann ist die sie für alle anderen Module verwendbar.
Und der, der diese Funktion BRAUCHT, schreibt "EXTERN" dazu.
*schauf* klaro ?
Lesezeichen