17
Linker & Loader in .NET August Steinbacher

Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

Embed Size (px)

Citation preview

Page 1: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

Linker & Loader in .NET

August Steinbacher

Page 2: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

Vortragsüberblick

C++ vs .NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

Page 3: 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

Page 4: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

.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

Page 5: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

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

Page 6: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

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

Page 7: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

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

Page 8: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

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

Page 9: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

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

Page 10: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

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

Page 11: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

Execution Model

SourceCode Compiler

csc, jsc,...Assembly

PE File + MSIL+ Metadaten

PE Verifikation

GAC

AppDirAssembly

Loader

Assembly InfoClass List

JITNative Code

ClassLoader

RuntimeLayout

Assembly

MethodClass

PolicyManager Policy

Erteilte Rechte

Page 12: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

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

Page 13: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

InstanceData

ObjectHeader

Ind

ex Sync Block

Table

MethodTable

EEClass

Runtime Layout

GCDesc

Object Reference

Interfacemap

Compiledmethod

JMI thunkModule

ClassLoader

Assembly

AppDomain

„Hot Data“

„Cold Data“

FieldDesc

MethodDescMethodDesc

Prestub ptr

PrestubPrestub ptr

Page 14: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

Method Table & Interface Map

Interface Map

1

2

3

4

5

GCDesc

MethodTableheader

Inheritedvirtuals

Introducedvirtuals

Instance andstatic

methods

Method Table

EEClass

Page 15: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

Meth

od

Imp

lem

enta

tion

sMethodenadressierung

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

Page 16: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

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/

Page 17: Linker & Loader in.NET August Steinbacher. Vortragsüberblick C++ vs.NET Auffinden von Assemblies Execution Model Runtime Layout Methodenadressierung

Ende...

...Fragen?