Forum: Compiler & IDEs ELF File Program Header Frage.


von Thomas D. (thomas_d)


Lesenswert?

Hallo zusammen,

als ich mir gerade ein ELF File angeschaut habe das mit gcc und binutils 
erzeugt wurde ist mir aufgefallen das dort das erste Segment im programm 
header bei Wert p_offset eine 0 stehen hat. Der eigentliche Code geht 
aber im File erst ab Adresse 0x100 los. Bei anderen, nicht mit gcc/ld 
erzeugten elf Files (zB mit GreenHills Toolkette) steht dort eigentlich 
immer der tatsächliche Offset im File drin.
Jetzt frage ich mich warum ist das so? Mit einem Offset von 0 würde ja 
das Segment auch den ganzen Elf-Header mit enthalten. Wenn ich aber mit 
objcopy ein Binär-Image erzeuge beginnt dies aber korrekt mit den Daten 
die ab 0x100 stehen also ohne den ELF-Header. Wiso kommt er den zu der 
Erkenntniss das trotz p_offset = 0 die Daten erst am der 0x100 beginnen.
Die Frage ist doch bestimmt schon öfter aufgetaucht, leider hab ich im 
Web keine verständliche Antwort gefunden.

Grüße,
Thomas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich habe dich noch nicht ganz bis zu Ende verstanden, aber mich
letztens (für AVRDUDE) auch mal mit sowas auseinander setzen müssen.

Bei der GNU-Toolchain musst du berücksichtigen, dass diese aus dem
Unix-Umfeld kommt und in erster Linie dafür konzipiert ist, dass man
die resultierenden ELF-Dateien unter einem Unix möglichst effektiv
geladen bekommt.  Das Laden erfolgt dabei durch simples Zuordnen
einer Speicherseite zu einem Dateiblock (memory mapping), weil man
auf diese Weise das VM-Subsystem (virtual memory) 1:1 benutzen kann.

Daraus ergibt sich aber, dass die ganzen ELF-Headers dann im Speicher
noch vor den ausführbaren Daten zu finden sind und nur durch die
entsprechenden Offsets ausgeblendet werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.