Ich bin dabei, objcopy
zu verwenden, um eine binäre Form einer Textdatei in eine ausführbare Datei einzufügen. (Zur Laufzeit brauche ich die Datei als String). Das funktioniert gut, bis der Linker die Verweise von den Symbolnamen finden muss. Das Problem ist, dass objcopy
die Symbolnamen mit dem Pfadnamen der Datei voranstellt. Da ich GNU Autotools zum Versand des Pakets verwende, ändert sich dieser vorangestellte Pfadname und ich weiß nicht, welches externe Linkersymbol im C / C ++ Programm verwendet werden soll.
libtest.a
wurde mit (Auszug aus Makefile.am) erstellt:
Wie kann ich objcopy
nur an den Stiel des Dateinamens als Linkersymbole erkennen? Oder gibt es einen anderen Weg um das Problem?
Etwas ironisch gesagt, können Sie objcopy
verwenden, um das Problem über die Option --redefine-sym
zu lösen, die das Umbenennen von Symbolen erlaubt ...
Wenn ich objcopy verwende, um eine Objektdatei von einem PNG in einem anderen zu erstellen Verzeichnis:
%Vor%Das resultierende Objekt hat die folgenden Symbole:
%Vor%Diese können dann umbenannt werden:
%Vor%Dies führt zu einem Objekt mit den Symbolnamen, die objcopy haben würde generiert, wenn das PNG im aktuellen Verzeichnis gefunden wurde:
%Vor%
Die generische Methode, Rohdaten in ELF einzufügen, wird von .incbin Assembler-Anweisungen unterstützt.
>Der Trick besteht darin, eine Vorlage .S-Datei zu erstellen, die wie folgt aussehen könnte:
%Vor%Diese Datei wird über cpp vorverarbeitet, so dass wir dort den Dateinamen nicht fest codieren müssen, z. wir können schreiben:
%Vor%... und dann beim Kompilieren übergeben:
%Vor%Schließlich, wenn wir Datei selbst vorbereiten, können wir einige zusätzliche Daten und / oder Informationen hinzufügen. Wenn Sie rohe "Textdateien" einschließen und möchten, dass diese als C-Zeichenfolgen verfügbar sind, können Sie das Byte "0" unmittelbar nach den Rohdaten hinzufügen:
%Vor%Wenn Sie volle Flexibilität wünschen, können Sie natürlich die Datei manuell vorverarbeiten, um einen Teil davon zu verändern, zB
%Vor%... und kompilieren Sie es dann:
%Vor%Eine einfache Lösung besteht darin, Ihre Textdatei in eine Datei umzuwandeln, mit der ein Array von Zeichen initialisiert werden kann. Also, Sie würden 0x41,0x42,0x43,0x30,0x31,0x32 für "ABC012" bekommen. Sie können diese Bytefolge dann # einschließen. Sie können auch escape alle Nicht-ASCII-Zeichen statt alles in Bytes konvertieren, so dass der größte Teil des Textes noch in der generierten Include-Datei lesbar ist.