Einbetten von binären Blobs mit gcc mingw

Lesezeit: 4 Minuten

Ich versuche, binäre Blobs in eine Exe-Datei einzubetten. Ich verwende mingw gcc.

Ich mache die Objektdatei wie folgt:

ld -r -b binary -o binary.o input.txt

Ich schaue mir dann die objdump-Ausgabe an, um die Symbole zu erhalten:

objdump -x binary.o

Und es gibt Symbole mit den Namen:

_binary_input_txt_start
_binary_input_txt_end
_binary_input_txt_size

Ich versuche dann, in meinem C-Programm darauf zuzugreifen:

#include <stdlib.h>
#include <stdio.h>

extern char _binary_input_txt_start[];

int main (int argc, char *argv[])
{
    char *p;
    p = _binary_input_txt_start;

    return 0;
}

Dann kompiliere ich so:

gcc -o test.exe test.c binary.o

Aber ich bekomme immer:

undefined reference to _binary_input_txt_start

Weiß jemand was ich falsch mache?

  • Übrigens war mir diese Methode, beliebige Daten in eine ausführbare Datei zu ziehen, nicht bewusst – nett.

    – Michael Burr

    13. April 2010 um 5:48 Uhr

  • Was bietet diese Methode, was nicht von angeboten wird .rc Dateien?

    – rubenvb

    20. Oktober 2011 um 9:36 Uhr

  • @rubenvb Einfacherer Zugriff auf Inhalte. Es sind keine Aufrufe von Ressourcen-APIs erforderlich

    – Benutzer877329

    15. März 2012 um 9:16 Uhr

  • Auch github.com/graphitemaster/incbin

    – Kerbin

    27. Februar 2021 um 5:16 Uhr

Benutzeravatar von Michael Burr
Michael Burr

Entfernen Sie in Ihrem C-Programm den führenden Unterstrich:

#include <stdlib.h>
#include <stdio.h>

extern char binary_input_txt_start[];

int main (int argc, char *argv[])
{
    char *p;
    p = binary_input_txt_start;

    return 0;
}

C-Compiler scheinen oft (immer?) einen Unterstrich voranzustellen extern Namen. Ich bin mir nicht ganz sicher, warum das so ist – ich nehme an, dass etwas Wahres daran ist dieser Wikipedia-Artikel behaupten, dass

Es war üblich, dass C-Compiler allen externen Bereichsprogrammkennungen einen führenden Unterstrich voranstellten, um Konflikte mit Beiträgen der Laufzeitsprachenunterstützung zu vermeiden

Aber es fällt mir auf, dass Sie den Namespace nicht wirklich stark partitionieren, wenn allen Externs Unterstriche vorangestellt würden. Wie auch immer, das ist eine Frage für einen anderen Tag, und Tatsache ist, dass die Unterstriche hinzugefügt werden.

  • Wow … vielen Dank. Das machte mich wahnsinnig. Ich wusste, es muss etwas Einfaches gewesen sein. Ich habe es gerade debuggt und festgestellt, dass es sich in __binary_input_txt_start geändert hat

    – myforwik

    13. April 2010 um 6:11 Uhr

  • @myforwik: nur für den Fall, dass es dich interessiert, ich habe eine Frage gestellt, in der ich frage, warum C das tut: stackoverflow.com/questions/2627511/…

    – Michael Burr

    13. April 2010 um 6:47 Uhr

  • @Michael: Die Behauptung des Artikels ist wahr. Die Laufzeiten wurden in Assembler geschrieben, der frei Namen ohne vorangestellte Unterstriche verwenden konnte und dadurch sicher sein konnte, nicht mit irgendwelchen im C-Code definierten Symbolen zu kollidieren, und umgekehrt hatte der C-Code keine Möglichkeit, auf die Symbole aus dem asm-Laufzeitcode zuzugreifen .

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    6. August 2011 um 23:24 Uhr

  • Weiß jemand, wie viele Daten auf diese Weise eingebettet werden können?

    – Benutzer877329

    15. März 2012 um 9:18 Uhr

  • @aditya: Vielleicht gibt es in diesem Detail einen Unterschied, der vom Ziel abhängt? Windows-Toolchains neigen dazu, externen Namen automatisch Unterstriche hinzuzufügen, wenn sie auf Win32 x86 abzielen. Ich wäre nicht überrascht, wenn dies bei anderen Zielen (sogar Win32 x64) nicht der Fall wäre.

    – Michael Burr

    9. Januar 2014 um 18:24 Uhr

Benutzeravatar von Matěj Pokorný
Matěj Pokorný

Aus ld Manpage:

–führender Unterstrich

–kein führender Unterstrich

Für die meisten Ziele ist das standardmäßige Symbolpräfix ein Unterstrich und wird in der Beschreibung des Ziels definiert. Mit dieser Option ist es möglich, das standardmäßige Unterstrich-Symbol-Präfix zu deaktivieren/aktivieren.

Also

ld -r -b binary -o binary.o input.txt --leading-underscore

sollte Lösung sein.

Benutzeravatar von user1742529
Benutzer1742529

Ich habe es unter Linux (Ubuntu 10.10) getestet.

  1. Ressourcendatei:
    Eingabe.txt

  2. gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 [generates ELF executable, for Linux]

    Erzeugt Symbol _binary__input_txt_start.
    Akzeptiert Symbol _binary__input_txt_start (mit Unterstreichung).

  3. i586-mingw32msvc-gcc (GCC) 4.2.1-sjlj (mingw32-2) [generates PE executable, for Windows]

    Erzeugt Symbol _binary__input_txt_start.
    Akzeptiert Symbol binary__input_txt_start (ohne Unterstreichung).

  • Mit tdm-gcc 4.8.1 muss ich mit dem Unterstrich auf die Variablen verweisen.

    – Hazer

    3. Oktober 2013 um 1:01 Uhr

Benutzeravatar von Josh Grams
Josh Gramm

Anscheinend ist diese Funktion im ld von OSX nicht vorhanden, also müssen Sie es tun ganz anders mit einem benutzerdefinierten gcc-Flag, das sie hinzugefügt haben, und Sie können nicht direkt auf die Daten verweisen, sondern müssen eine Laufzeitinitialisierung durchführen, um die Adresse zu erhalten.

Daher ist es möglicherweise portabler, sich eine Assembler-Quelldatei zu erstellen, die die Binärdatei zum Zeitpunkt des Erstellens enthält, a la this answer.

1411030cookie-checkEinbetten von binären Blobs mit gcc mingw

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy