AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wozu Relocation?

Ein Thema von Namenloser · begonnen am 16. Mär 2014 · letzter Beitrag vom 30. Mär 2014
Antwort Antwort
Seite 2 von 3     12 3      
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Wozu Relocation?

  Alt 16. Mär 2014, 17:28
Richtig, und bei speziellen (Mikro-?)Prozessoren gibt es soweit ich weiß auch Pointer-Längen, die kein Vielfaches von 8 sind.

Geändert von Namenloser (16. Mär 2014 um 17:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

AW: Wozu Relocation?

  Alt 16. Mär 2014, 17:34
Weiß Jemand, wie diese Relocationstabellen aufgebaut sind?

Entweder man gibt da mit an, was wie angepasst werden muß (bei jeder Stelle einzeln oder indem man Gleiches gruppiert),
oder man analysiert die Stelle, welche angepasst werden muß,
oder man definiert, daß die anzupassenden Stellen immer nur ein bestimmtes Format haben können/dürfen.

Ersteres und Letzeres ist einfacher und ich würde Eines davon verwenden,
denn es gibt nicht nut Jumps anzupassen, sondern auch "Zeiger" auf betimmte Resourcen, wie z.B. vielen String-Konstanten im Code.
$2B or not $2B
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Wozu Relocation?

  Alt 16. Mär 2014, 17:38
es gibt nicht nut Jumps anzupassen, sondern auch "Zeiger" auf betimmte Resourcen, wie z.B. vielen String-Konstanten im Code.
Stimmt, daran hatte ich gar nicht gedacht. Da macht Relocation auch Sinn.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#14

AW: Wozu Relocation?

  Alt 16. Mär 2014, 18:08
Weiß Jemand, wie diese Relocationstabellen aufgebaut sind?
Wenn du das wirklich wissen willst, ist vermutlich die Dokumentation des PE-Formats ein guter Recherche-Startpunkt.

Da macht Relocation auch Sinn.
Ich denke, warum Relocation Sinn macht, ist leicht zu erkennen: Adresskonflikte bei Laufzeitbibliotheken, Address-Randomisierung (Sicherheit) oder Kompaktierung (bei Maschinen ohne virtuelle Adressen). Wie es gemacht wird und welche Ansprüche dabei an den Code / Objektdateien gestellt werden, ist eine andere Sache.

Wenn man nur relativ (von wo aus auch immer) adressiert und das von der Hardware unterstützt wird, dann braucht man keine Relocationstabellen. Je mehr Adressierungsarten unterstützt werden, desto komplizierter werden auch die Tabellen (oder sonstige Methoden).
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#15

AW: Wozu Relocation?

  Alt 16. Mär 2014, 18:09
Also ich hab das noch grob in Erinnerung, sind bereits zwei Semester her seit der BS VO xD

Im Grunde ist es ja so, dass DLLs als Shared Memory Objekte geladen werden, sprich das Betriebssystem weiß, ok, an diesem Modul wird sich im Speicher kaum etwas ändern, laden wirs ein einziges mal und jedesmal, wenn eine Anwendung, egal welche und wie viele, darauf zugreifen wollen, kriegen sie dieselbe Adresse im Hauptspeicher bzw. dieselbe (=einzige) Instanz des Moduls.
Folglich kann es der Fall sein, dass z.B. mehrere DLLs konfliktäre Anfangsadressen haben. Die DLL wird dann auf eine bestimmte andere freie Stelle im Speicher geladen/gemappt und die Relocation wird angewandt.
Ich weiß jetzt nicht genau, inwiefern Virtualisierung bei shared Objekten stattfindet..

Beispiel:
Code:
Shared Objekt "X":
Basisadresse: 10
Größe: 100
Adressraum: 10..110

Shared Objekt "Y":
Basisadresse: 100
Größe: 50
Adressraum: 100..150

- X wurde geladen, Y soll nun geladen werden
- Adressraum bereits belegt, Relocation muss stattfinden
-- Y an eine freie und genügend große Stelle laden
-- alle absoluten Adressen dementsprechen neu berechnen
(hier hilft dann evt. die Relocation Table iwie, kA. wie genau; relative Adressen werden übrigens nicht angerührt, was ja Sinn macht)
Dasselbe gilt im Grunde auch für non-shared Memory Objekte (Exe?). Deren Adresse kann auch mit bereits geladenen DLLs kollidieren.
Achja, wie genau dann die Relocation funktioniert weiß ich auch nicht. Das haben wir, glaub ich, gar nicht in Detail durchgenommen.

Bin mir da aber absolut nicht mehr sicher. Du kannst dir da vlt. etwas besseres daraus reimen?!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (16. Mär 2014 um 18:12 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#16

AW: Wozu Relocation?

  Alt 16. Mär 2014, 18:29
Danke für den ausführlichen Post, aber so weit war mir das schon klar. Ich stand nur irgendwie auf dem Schlauch, wo man sowas braucht, da ich beim Speicher nur gedacht habe an: Code (relative Sprünge), Stack (auch relativ) und Heap (sowieso dynamisch). An sowas wie Konstanten oder globale Variablen hatte ich nicht gedacht.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#17

AW: Wozu Relocation?

  Alt 16. Mär 2014, 18:36
Achja, wie genau dann die Relocation funktioniert weiß ich auch nicht. Das haben wir, glaub ich, gar nicht in Detail durchgenommen.
Weil es relativ nutzloses Wissen ist. 99% der Studenten werden niemals damit zu tun haben. Die, die es wissen müssen, weil sie entweder Loader oder Compiler/Linker schreiben, müssen sich eh mit der entsprechenden Dokumentation auseinandersetzen.

Das
es passiert, ist wichtig zu wissen.
Warum es nötig ist, ist wichtig zu wissen.
Was allgemein gemacht wird / werden kann, ist relativ trivial.
Was im Detail passiert ist ziemlich System-spezifisch und interessiert nur sehr wenige.

Geändert von BUG (16. Mär 2014 um 18:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#18

AW: Wozu Relocation?

  Alt 17. Mär 2014, 07:32
Danke für den ausführlichen Post, aber so weit war mir das schon klar. Ich stand nur irgendwie auf dem Schlauch, wo man sowas braucht, da ich beim Speicher nur gedacht habe an: Code (relative Sprünge), Stack (auch relativ) und Heap (sowieso dynamisch). An sowas wie Konstanten oder globale Variablen hatte ich nicht gedacht.
Absolute Sprünge sind durchaus Gang und Gäbe. Calls von Subroutinen werden zum Beispiel meist mit nem Label gemacht und die sind dann absolut. Oder denke an Prozedurvariablen. Da speicherst du ja den Pointer zu der Prozedur in einer Variable und wenn der Compiler da jetzt die relative Adresse speichern würde, dann wäre die Adresse ja nur für den Punkt der Zuweisung gültig, aber nicht wenn er 2000 Befehle weiter dann letztendlich ausgeführt wird. Deswegen hat jede DLL (oder unter Linux ein Shared Object) eine Basisadresse, relativ zu der absolute Adressen angesehen werden. Die Relocationtable enthält dann die Positionen aller absoluten Adressen im Code (deren "Deklaration" und deren Verwendung), so dass Windows diese dann im Image anpassen kann. Linux macht das übrigens nicht (und Mac OS X auch nicht). Dort gibt es das Konzept von PIC, was für Position Independant Code steht. Da hält der Compiler in einem Register dann eine Global Offset Table (GOT), in der an bestimmten Offsets die Adressen von globalen Variablen, Prozeduren, etc. stehen und der dynamische Linker ist dann frei die Bibliothek an eine beliebige Stelle zu laden ohne erst noch das Image anpassen zu müssen.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#19

AW: Wozu Relocation?

  Alt 17. Mär 2014, 16:31
Wenn du mehr über den Aufbau der .reloc Section wissen willst, schau mal hier rein:
http://msdn.microsoft.com/en-us/libr.../gg463119.aspx

Grob gesagt enthält die Tabelle (unter x86 und x64) die direkten Offsets zu den absoluten Adressen. Opcodes, Prefixes, etc. werden sozusagen einfach übersprungen. Unter Verwendung sind zur Zeit (bei Windows Kompilaten) nur zwei verschiedene Relocation Typen. Bei beiden wird erst die Differenz zwischen gewünschter ImageBase und reeller ImageBase gebildet und dann zur Adresse addiert.

BASED_HIGHLOW kommt hierbei bei 32 bit Kompilaten vor und besagt, dass die Zieladresse 32 Bit lang ist. 64 Bit Kompilate verwenden stattdessen BASED_DIR64, um zu signalisieren, dass volle 64 Bit für eine Adresse verwendet werden.

Laut Dokumentation gibt es noch weitere (zZ. unbenutze Typen), welche beispielsweise auch 16 Bit Adressen signalisieren könnten.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#20

AW: Wozu Relocation?

  Alt 17. Mär 2014, 16:40
Okay, danke für die Info. (Das ist mal wieder typisch Microsoft, das Dokument nur als Word-Document bereitzustellen... ich habe hier gerade kein Programm um sowas zu öffnen.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz