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.
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.
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).
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
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.
14110300cookie-checkEinbetten von binären Blobs mit gcc mingwyes
Ü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