2010-07-16 16 views
6

Ich suche nach einer einfachen Möglichkeit, die ELF-Dateiabschnitte neu anzuordnen. Ich habe eine Sequenz von benutzerdefinierten Abschnitten, die alle in einer bestimmten Reihenfolge ausgerichtet werden sollen.Einfache Möglichkeit, ELF-Dateiabschnitte neu zu ordnen

Der einzige Weg, wie ich es gefunden habe, ist ein Linker-Skript zu verwenden. Die Dokumentation weist jedoch darauf hin, dass das Angeben eines benutzerdefinierten Linkerskripts den Standardwert überschreibt. Das Standard-Linker-Skript enthält eine Menge Inhalt, den ich nicht in meinem benutzerdefinierten Skript duplizieren möchte, nur um drei Abschnitte immer in einer bestimmten Reihenfolge zusammen zu bekommen. Es scheint nicht sehr flexibel zu sein, das Linker-Verhalten so zu codieren.

Warum möchte ich das tun? Ich habe einen Bereich von Daten, die ich den Laufzeitspeicherort von (Anfang und Ende) kennen muss. Also habe ich zwei zusätzliche Abschnitte erstellt und Sentinel-Variablen darin eingefügt. Ich möchte dann die Speicherplätze dieser Variablen verwenden, um das Ausmaß des unbekannten Abschnitts im Speicher zu kennen.

.markerA 
    int markerA; 
.targetSection 
    ... Lots of variables ... 
.markerB 
    int markerB; 

Im obigen Beispiel würde ich wissen, dass die Daten in .targetSection zwischen der Adresse markerA und markerB ist.

Gibt es einen anderen Weg, dies zu erreichen? Gibt es Bibliotheken, mit denen ich das aktuell ausgeführte ELF-Bild einlesen und den Standort und die Größe des Abschnitts bestimmen kann?

+1

Was ist Ihre Werkzeugkette (Compiler/Linker)? Sie könnten das Standardlinkerskript in eine andere Datei kopieren und einfügen und nur das ändern, was Sie wollen ... –

+0

Ich benutze gcc. Ich weiß, ich kann das aktuelle Linker-Skript exportieren, ändern und verwenden. Es kann jedoch Hunderte von diesen Anwendungen geben, die nicht alle von unserem Team entwickelt wurden, und ich würde es hassen, wenn sie alle an eine "alte" Version des Linker-Skripts gebunden wären. Ich hatte gehofft, dass es einen Weg gäbe, einige Abschnitte zu ordnen, ohne sich in das restliche Linker-Verhalten einzumischen. – MrSlippers

+0

Gibt es einen Grund, warum Sie Linker-Skripte verwenden? Vielleicht können Sie Ihre Variablen in die Frame-Datenstruktur (struct, class, ...) platzieren und eine statische Variable zuweisen. – Uhli

Antwort

4

Sie können Adressen von geladenen Abschnitten durch Analysieren des ELF-Dateiformats erhalten. Details können z.B. in

  • Tool Interface Standard (TIS) tragbare Formate Spezifikation, Version 1.2 (http://refspecs.freestandards.org/elf/elf.pdf)

für einen kurzen Eindruck, Informationen sind verfügbar, lohnt sich ein Blick auf readelf

readelf -S <filename> 

gibt eine Liste aller Abschnitte in enthalten.

  1. Die Abschnitte, die in Arbeitsspeicher zugeordnet wurden, wurden PROGBITS eingegeben.
  2. Die Adresse, nach der Sie suchen, wird in der Spalte Addr angezeigt.
  3. Um den Speicherplatz Sie die Last-Adresse Ihres ausführbaren/shared object

Es gibt ein paar Möglichkeiten, um die Last-Adresse Ihrer ausführbaren/shared Objekt hinzufügen, haben zu erhalten, um festzustellen:

  1. können Sie/proc/[pid]/maps (die erste Spalte enthält die Ladeadresse) analysieren. [pid] ist die Prozess-ID
  2. Wenn Sie eine Funktion in Ihrer Datei enthalten kennen, können Sie dlsym anwenden, um einen Zeiger auf die Funktion zu erhalten.Dieser Zeiger ist der Eingangsparameter für dladdr eine Dl_info struct Rückkehr der angeforderten Ladeadresse

um einige ELF Informationen, um die Bibliothek

  • libelf

zu bekommen kann eine hilfreiche companian (I enthält, entdeckt es nach dem Studium der oben genannten TIS, so habe ich nur einen kurzen Blick auf es und ich weiß nicht tiefer Details)

Ich hoffe, dass diese Skizze einer möglichen Lösung helfen wird.

1

Sie können in Erwägung ziehen, GCC-Initialisierer zu verwenden, um die Variablen zu referenzieren, die sonst in einen separaten Abschnitt gehen und alle ihre Zeiger in einem Array beibehalten würden. Ich empfehle Initialisierer zu verwenden, da dies Datei-unabhängig funktioniert.

0

Sie können sich ELFIO library ansehen. Es enthält WriteObj- und Writer-Beispiele. Mithilfe der Bibliothek können Sie ELF-Binärdateien programmgesteuert erstellen/ändern.

0

Ich fürchte, überschreiben das Standard-Link-Skript ist die einfache Lösung.

Da Sie sich Sorgen machen, dass es möglicherweise nicht flexibel ist (sogar ich denke, dass das Link-Skript das oft ändert), könnten Sie ein Skript schreiben, um ein Link-Skript basierend auf dem Standard-Id-Skript des Host-Systems zu erstellen ("ld --verbose") und fügen Sie Ihre speziellen Abschnitte ein.

Verwandte Themen