170 likes | 356 Views
Linker & Loader in .NET. August Steinbacher. Vortragsüberblick. C++ vs .NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung. Traditioneller Ansatz. Compiler Frontend: Parsen der High-Level-Syntax Kompilieren in Zwischencode Compiler Backend:
E N D
Linker & Loader in .NET August Steinbacher
Vortragsüberblick • C++ vs .NET • Auffinden von Assemblies • Execution Model • Runtime Layout • Methodenadressierung
Traditioneller Ansatz • Compiler Frontend: • Parsen der High-Level-Syntax • Kompilieren in Zwischencode • Compiler Backend: • Zwischencode -> Native Code • Platzhalter für imports & exports • Linker: • Erzeugen eines executable file • Loader: • Platzieren des Executables im Speicher App1.cpp App2.cpp Incl.h Compiler Objekt datei Objekt datei Linker EXE Datei Loader Image in MEM
Assemblies .NET Modell • Compiler Frontend: • Parsen der High-Level-Syntax • Erzeugen von Zwischencode + Metadaten • Assemblies • Compiler Backend (CLR): • Lokalisieren des Assemblies • Erzeugen von Native Code • Kompilieren • Linken • Laden Source Source Compiler Compiler CLR Processes Memory
Ausführen von .NET • .exe Datei starten • Windows-loader startet die CLR • Applikation läuft innerhalb der CLR • Applikationsdomäne • Isoliert Applikationen voneinander • Laden aller Assemblies, Module und Typen • Methodentabellen der Typen • Statische Felder und Objekte • Side-by-Side Execution • Eintrittspunkt • Schlüsselwort .entrypoint in PE-Datei
Assemblies 3 Levels of Loading • Laden der PE-Datei von Disk • Einziger Festplattenzugriff • Enthält Metadaten • Laden des Assemblies • Aufgrund der Metadaten • Sicherheitsmanager prüft Rechte • Laden der Typen • Classloader PE-Datei String Integer Object
Lokalisieren von Assemblies • Assembly Resolver • Name des gesuchten Assemblies • Versionsinformation • Informationen über AppDomain • Konfigurationsdateien • Öffentliche Assemblies • GAC • Codebase-Hints in Konfigurationsdateien • Private Assemblies • Im Applikationsverzeichnis • Probing
Public Key? N J In GAC? J Lade File aus GAC N <CodeBase> Vorhanden? Passt File? J J Lade File von <CodeBase> N N Probing erfolgreich? Passt File? J J Lade File N N Assembly.Load endet mit Fehler Lokalisieren von Assemblies Assembly.Load(name)
[AppDir] / [Assembly name].dll [AppDir] / [Assembly name] / [Assembly name].dll C:/App/code.dll C:/App/code/code.dll [AppDir] / [binpath] / [Assembly name].dll [AppDir] / [binpath] / [Assembly name] / [Assembly name].dll C:/App/shared/code.dll C:/App/shared/code/code.dll [AppDir] / [culture] / [Assembly name].dll [AppDir] / [culture] / [Assembly name] / [Assembly name].dll [AppDir] / [binpath] / [culture] / [Assembly name].dll [AppDir] / [binpath] / [culture] / [Assembly name] / [Assembly name].dll C:/App/en-US/code.dll C:/App/en-US/code/code.dll C:/App/shared/en-US/code.dll C:/App/shared/en-US/code/code.dll Probing • 4 Kriterien: • Applikationsverzeichnis • Culture-Attribut • Assembly Name • Relativer Suchpfad
Laden eines Typs T • Durch Classloader • Bestimmung des benötigten Speicherplatzes • Bestimmung des Speicherlayouts • Auflösen von Referenzen auf bereits geladene Typen • Stubs erzeugen für Methoden von T • Methodenaufrufe lösen JIT-Kompilierung aus • Verifikation der Typsicherheit • 4 Kategorien • Ungültig • Gültig • Typsicher • Verifizierbar Ungültig Gültig Typsicher Verifizierbar
PE Verifikation Compiler csc, jsc,... Source Code Assembly PE File + MSIL + Metadaten Policy Manager Assembly Loader Assembly Info Class List Policy GAC AppDir Erteilte Rechte Assembly Method Class Class Loader JIT Native Code Runtime Layout Execution Model
Objektinstanzen Instance of A Instance of B Instance of A Heap Instance Data Instance Data Instance Data Method Table A Method Table B Sync Block Table Private EE Memory
Object Reference ObjectHeader InstanceData Index Sync Block Table Interfacemap MethodTable Module JMI thunk Compiledmethod Class Loader „Hot Data“ „Cold Data“ Prestub ptr Assembly Prestub ptr Prestub EEClass MethodDesc MethodDesc App Domain FieldDesc Runtime Layout GCDesc
Method Table Interface Map GCDesc 1 2 3 MethodTableheader EEClass 4 5 Inheritedvirtuals Introducedvirtuals Instance andstatic methods Method Table & Interface Map
A.m1; I1.m1; class C : B { I2.m2() {..}; } A.m1; I1.m1; A.m1; I1.m1 A.m2; I1.m2; A.m2; I1.m2; I2.m2 A.m2; I1.m2 B.m3; B.m3; I2.m3 class A : I1 { m1(){..}; m2(){..}; } A.m1; A.m2; Method Implementations class B : A, I2 {m3(){..}; } B.m3; A.m1; I1.m1; A.m2; I1.m2; B.m3; I2.m2; I2.m3; Methodenadressierung interface I1 { m1(); m2(); } interface I2 { m2(); m3(); }
Quellen • Don Box, Chris Sells: Essential .NET, The Common Language Runtime, Addison-Wesley 2003 • Dave Stutz, Ted Neward, Geoff Shilling: Shared Source CLI Essentials. O'Reilly 2003 • W.Beer, D.Birngruber, H.Mössenböck, A.Wöß: Die .NET-Technologie, dpunkt.verlag 2002 • http://www.msdn.microsoft.com/netframework/ • http://www.dotnetframework.de • http://dotnet.di.unipi.it/
Ende... ...Fragen?