57 votes

Incorporation de blobs binaires à l'aide de gcc mingw

Je suis en train d'intégrer des blobs binaires dans un fichier exe. J'utilise mingw gcc.

Je fais l'objet fichier comme ceci:

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

J'ai ensuite chercher objdump de sortie afin d'obtenir les symboles:

objdump -x binary.o

Et il donne des symboles nommé:

_binary_input_txt_start
_binary_input_txt_end
_binary_input_txt_size

J'ai ensuite essayer et d'y accéder dans mon programme C:

#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;
}

Ensuite je compile comme ceci:

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

Mais j'ai toujours:

undefined reference to _binary_input_txt_start

Personne ne sait ce que je fais de mal?

40voto

Michael Burr Points 181287

Dans votre programme C supprimez le trait de soulignement:

#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;
}

Les compilateurs C souvent (toujours?) semblent ajouter un trait de soulignement pour extern noms. Je ne suis pas entièrement sûr de savoir pourquoi est - je suppose qu'il y a une part de vérité dans cet article de wikipedia de prétendre que

Il était de pratique courante pour les compilateurs C pour ajouter un trait de soulignement à tous les portée externe identificateurs de programme pour éviter des affrontements avec les contributions de runtime support de la langue

Mais il me semble que si souligne été ajouté à tous les externes, alors vous n'êtes pas vraiment le partitionnement de l'espace de noms très bien. De toute façon, c'est une question pour un autre jour, et le fait est que les traits de soulignement n'est ajoutée.

6voto

user1742529 Points 91

Je l'ai testé sous Linux (Ubuntu 10.10).

  1. Ressource de fichier:
    input.txt

  2. gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 [génère l'exécutable ELF, pour Linux]
    Génère symbole _binary__input_txt_start.
    Accepte le symbole _binary__input_txt_start (à souligner).

  3. i586-mingw32msvc-gcc (GCC) 4.2.1-sjlj (mingw32-2) [génère PE exécutable pour Windows]
    Génère symbole _binary__input_txt_start.
    Accepte le symbole binary__input_txt_start (sans trait de soulignement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X