linker & loader in .net
DESCRIPTION
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: - PowerPoint PPT PresentationTRANSCRIPT
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
App2.cpp Incl.h
Objektdatei
Objektdatei
EXEDatei
Imagein MEM
Compiler
Linker
Loader
App1.cpp
.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
Assemblies
Compiler
CLR
ProcessesMemory
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
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
Assemblies
Object
Integer
String
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
Lokalisieren von AssembliesAssembly.Load(name)
Public Key?
Lade FileJ
In GAC?
J
Lade File aus GACJ
<CodeBase>Vorhanden?
N
Passt File?J
Probingerfolgreich?
N
N
Passt File?J
N
Lade File von <CodeBase>
J
Assembly.Load endet mit Fehler
N
N
Probing 4 Kriterien:
Applikationsverzeichnis Culture-Attribut Assembly Name Relativer Suchpfad
[AppDir] / [Assembly name].dll[AppDir] / [Assembly name] / [Assembly name].dll
C:/App/code.dllC:/App/code/code.dll
[AppDir] / [culture] / [Assembly name].dll[AppDir] / [culture] / [Assembly name] / [Assembly name].dll
C:/App/en-US/code.dllC:/App/en-US/code/code.dll
[AppDir] / [binpath] / [Assembly name].dll[AppDir] / [binpath] / [Assembly name] / [Assembly name].dll
C:/App/shared/code.dllC:/App/shared/code/code.dll
[AppDir] / [binpath] / [culture] / [Assembly name].dll[AppDir] / [binpath] / [culture] / [Assembly name] / [Assembly name].dll
C:/App/shared/en-US/code.dllC:/App/shared/en-US/code/code.dll
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 Gültig
Typsicher
VerifizierbarUngültig
Execution ModelSourceCode Compiler
csc, jsc,...Assembly
PE File + MSIL+ Metadaten
PE Verifikation
GACAppDir
AssemblyLoader
Assembly InfoClass List
JIT Native CodeClassLoader
RuntimeLayout
Assembly
MethodClass
PolicyManager Policy
Erteilte Rechte
Objektinstanzen
Instance Data
Instance Data
Instance Data
Method Table A
Method Table B
Sync Block Table
Instance of A
Instance of B
Instance of A
Heap
Private EE Memory
InstanceData
ObjectHeader
Index Sync Block Table
MethodTable
EEClass
Runtime Layout
GCDesc
Object Reference
Interfacemap
Compiledmethod
JMI thunkModule
ClassLoader
Assembly
AppDomain
„Hot Data“
„Cold Data“
FieldDesc
MethodDescMethodDesc
Prestub ptrPrestub
Prestub ptr
Method Table & Interface MapInterface Map12345
GCDesc
MethodTableheader
Inheritedvirtuals
Introducedvirtuals
Instance andstatic
methods
Method Table
EEClass
Method Im
plementations
Methodenadressierung
class C : B { I2.m2() {..}; } A.m1; I1.m1;A.m2; I1.m2;B.m3;I2.m2;I2.m3;
interface I1 { m1(); m2(); }interface I2 { m2(); m3(); }
B.m3; class B : A, I2 {m3(){..}; }
A.m1; A.m2;
class A : I1 { m1(){..}; m2(){..}; }
A.m1; I1.m1A.m2; I1.m2
A.m1; I1.m1;A.m2; I1.m2; B.m3;
A.m1; I1.m1;A.m2; I1.m2; I2.m2 B.m3; I2.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?