Eigene C++ Programme verstehen (.reloc? PADDING?)

Hi,

seit ein paar Wochen beschäftige ich mich intensivst mit (ANSI) C und C++, nachdem ich nun die absoluten Grundlagen verstanden habe, habe ich mir mal angeguckt, wie die Dateien nach dem Kompilieren und Linken aussehen und was da überhaupt passiert. Im Moment könnte ich ein ganzes Buch mit Fragen die sich mir stellen schreiben. Soviel zur Vorgeschichte. Heute wollte ich mir mal anschauen, wie weit ich die Dateigröße nach unten drücken kann. Dazu habe ich mir dieses hier und jenes hier (*klick* ^^) angeschaut. Dort werden allerdings nicht diese Fragen beantwortet:

1. Wozu dient die .reloc-Sektion?
2. Wozu dient "PAPADDINGXX" (/ ist das notwendig)?

Danke
 
Kommt auf den Compiler an.

Reloc Section beinhaltet Relocations:
http://en.wikipedia.org/wiki/Relocation_(computer_science)
d.h eine Art Tabelle mit Adressen.
Kurz gesagt:
der Linker erstellt eine Executable, die an eine bestimmte Basisadresse (ImageBase) im Speicher gebunden ist.
D.h bei der Ausführung diese Exe wird erwartet, dass sie vom System an diese Adresse geladen wird. Alle adressabhängigen Anweisungen, Speicherzugriffe usw werden von dieser Basisadresse ausgehend generiert (z.b sowas wie CALL DWORD PTR [401000] ).
Allerdings kann es vorkommen, dass die Executable nicht an diese Adresse geladen werden kann (warum auch immer - kommt eigentlich nur bei DLLs vor. Denn jede Exe bekommt einen eigenen virtuellen Adressraum zugesichtert, wogegen DLLs ja i.r in den Adressraum der Executables "hinzugeladen" werden und damit bei "Standardimagebasen" zu überschneidungen kommen kann). Dann kommt die .reloc Tabelle zum Einsatz. Der PE-Loader lädt die Exe/DLL an eine andere Basisadresse als vom Linker angegeben, geht diese RelocTabelle durch und patcht die Bytes in den angegebenen Adressen, so dass die Anwendung lauffähig bleibt.

In einer normalen Executable braucht die RELOC Tabelle i.R Regel kein Mensch. Daher kann man RELOCs auch getrost weglassen. Unter MS Linker sollte die Option /FIXED helfen, bei GCC sowas wie --strip-all (falls gcc das überhaupt macht, hab im Moment keine Möglichkeit nachzuprüfen). Optionen für Borland Compiler/Linker müsstest du selber suchen.
 
Zurück
Oben