ELF-Datei-Header
Eine kurze Frage über elf-Datei-Header, ich kann nicht scheinen, etwas zu finden, nützliche Informationen zum hinzufügen/ändern von Feldern im elf-header. Ich möchte in der Lage sein zu ändern die magischen zahlen und fügen Sie eine build-Datum in den header, und wahrscheinlich ein paar andere Dinge.
Wie ich es verstehe, erstellt der linker die header-Informationen, aber ich sehe nichts in der LD-Skript, das bezieht sich auf es (obwohl ich bin neu in der ld-Skripte).
Bin ich mit gcc und Gebäude für ARM.
Dank!
Updates:
- ok, vielleicht war meine erste Frage sollte sein: ist es möglich, zu erstellen/Bearbeiten Sie die header-Datei zur link-Zeit?
InformationsquelleAutor Richard | 2008-10-24
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, von linker-Skript-Befehle, die dies tun können, aber Sie können es tun, post-link mit der objcopy Befehl. Die --add-Abschnitt option kann verwendet werden, um einen Abschnitt mit beliebigen Daten der ELF-Datei. Wenn der ELF-header enthalten nicht die Felder, die Sie wollen, stellen Sie einfach einen neuen Abschnitt, und fügen Sie Sie dort.
Dieser link (teensy elf-binary) war jemand die Antwort auf eine andere Frage, aber es geht in die Feinheiten eines ELF-header im detail.
Bin ich ziemlich sicher, dass eine ausreichend komplexe ld-Skript tun können, was Sie wollen. Ich habe allerdings keine Ahnung, wie.
Auf der anderen Seite, elfsh leicht tun können, alle Arten von Manipulationen zu elf Objekte, so geben Sie ihm einen Wirbel.
Können Sie ein Objekt erstellen Datei mit informativen Felder wie eine Versionsnummer und einen link, die Datei so, daß Sie in der resultierenden ELF-Binärdatei.
Ident
Beispielsweise als Teil von Ihr build-Prozess, die Sie generieren kann - sagen -
info.c
enthält eine oder mehrere#ident
Richtlinien:Kompilieren:
Überprüfen, ob die Informationen, die enthalten ist:
Alternativ können Sie
objdump -s --section .comment info.o
. Beachten Sie, dass GCC schreibt auch seinen eigenen Kommentar, standardmäßig.Überprüfen Sie die Informationen, die nach der Linksetzung ein ELF executable:
- Kommentar
Mit
#ident
in einem C-übersetzungseinheit ist im Grunde gleichwertig zum erstellen einer.comment
Abschnitt in einer assembler-Datei. Beispiel:Mit einem ungewöhnlichen Namen arbeiten (z.B.
.section .blahblah
). Aber.comment
verwendet und verstanden werden von anderen tools. GNU-wie versteht sich auch auf die.ident
Richtlinie, und das ist, was übersetzt GCC#ident
zu.Mit Symbolen
Für Daten, die Sie wollen auch den Zugriff aus der ELF ausführbare Datei selbst müssen Sie erstellen Symbole.
Objcopy
Sagen, Sie wollen, um einige magic bytes, gespeichert in einer Datendatei:
Konvertieren in eine Objekt-Datei mit GNU objcopy:
Check für die Symbole:
Beispiel:
Link alles zusammen:
GNU ld
GNU-ld ist auch in der Lage, schalten Sie Daten-Dateien in Objekt-Dateien mit einer objcopy kompatibel Namensschema:
Im Gegensatz zu objcopy, Sie stellt die Symbole in der
.data
statt der.rodata
Abschnitt, obwohl (vgl.objdump -h magic.o
).incbin
Im Falle GNU objcopy nicht verfügbar ist, kann man die GNU da
.incbin
- Direktive zum erstellen der Objekt-Datei (montieren mitgcc -c incbin.s
):xxd
Eine mehr tragbare alternative, die nicht erfordern GNU objcopy noch GNU-wie ist die Erstellung einer intermediate C-Datei und kompilieren Sie und verknüpfen Sie, dass. Zum Beispiel mit xxd:
Könnten Sie in der Lage sein zu verwenden libmelf, ein Totes Projekt auf freshmeat, aber aus LOPI - http://www.ipd.bth.se/ska/lopi.html
Sonst, kann man die Skillung und (über -) schreiben der header selbst.
Ich nicht getan habe, diese in eine Weile, aber können Sie nicht einfach Anhängen, beliebige Daten in eine ausführbare Datei. Wenn Sie immer anfügen Feste Größe Daten wäre es trivial, sich zu erholen, was Sie Anhängen. Variable Größe wäre nicht viel schwieriger. Wahrscheinlich einfacher als messing w/elf-Header und möglicherweise ruinieren Sie ausführbare Dateien.
Ich nicht fertig, das Buch, aber iirc Linker und Lader von John Levine hatte die blutigen details, die Sie benötigen würden, um in der Lage sein, dies zu tun.
In Solaris, die Sie verwenden können elfedit aber ich denke, Sie sind wirklich Fragen-Lösungen für Linux. Linux Ist Nicht Gleich UniX 😛
In Der Linux-Konsole:
$ Mann ld
$ ld --verbose
HTH