L'incorporation de ressources dans exécutable à l'aide de GCC
Je suis à la recherche d'un moyen facile d'intégrer externe des données binaires dans une application C/C++ compilé par GCC.
Un bon exemple de ce que j'aime faire, c'est de la manipulation de code du shader - je ne peux il suffit de le garder dans les fichiers source comme const char* shader = "source here";
mais c'est extrêmement pratique.
J'aimerais le compilateur de le faire pour moi: lors de la compilation (étape de lien), lire le fichier "toto.bar" et le lien de son contenu de mon programme, de sorte que je serais en mesure d'accéder à du contenu en tant que données binaires à partir du code.
Pourrait être utile pour de petites applications qui je tiens à distribuer en une seule .fichier exe.
Ne GCC soutien à quelque chose comme ça?
Vous devez vous connecter pour publier un commentaire.
Il y a deux possibilités:
utilisation ld la capacité de transformer n'importe quel fichier dans un objet (L'incorporation de blobs binaires à l'aide de gcc, mingw):
utiliser un
bin2c
/bin2h
utilitaire permettant de transformer n'importe quel fichier dans un tableau d'octets (Incorporer une image dans le code, sans l'aide de la section de la ressource ou des images externes)Mise à jour: Voici un exemple plus complet de comment utiliser les données lié à l'exécutable à l'aide de
ld -r -b binary
:Mise à jour 2 - Obtenir la ressource de la taille: je ne pouvais pas lire _binary_foo_bar_size correctement. Au moment de l'exécution, gdb me montre la bonne taille de la ressource de texte en utilisant
display (unsigned int)&_binary_foo_bar_size
. Mais en l'assignant à une variable a donné toujours une valeur incorrecte. J'ai pu résoudre ce problème de la manière suivante:C'est une solution de contournement, mais il fonctionne bien et n'est pas trop moche.
'\0'
à la fin du texte, si vous avez besoin d', elle a mis fin comme ça. Certains l'expérimentation pourrait être dans l'ordre.objdump: foo.o: File format not recognized
erreur, et une autre semblable lors de la tentative de lier l'objet à ma source. Tous les conseils? Je suis sur Windows, à l'aide tdm-mingw 4.5.1 et mon ld -v rendementsGNU ld (GNU Binutils) 2.20.51.20100319
. Je peux secours pour votre deuxième suggestion, si c'est juste ma curiosité à partir de maintenant. 🙂gcc (GCC) 4.5.1
,GNU ld (GNU Binutils) 2.20.1.20100303
, etGNU objdump (GNU Binutils) 2.20.1.20100303
. Sur votre système, neobjdump -i
rien dire à propos de labinary
format?ld
pour créer lefoo.bar.o
fichier (que cela - que je peux utiliser tdm de construire pour le reste), alors tout fonctionne bien. Je trouve cela un peu surprenant que nous sommes en train d'obtenir des résultats différents ici. Voir: nopaste.voric.com/paste.php?f=95zizgVirtualAlloc
etmmap
); en limitant l'accès, vous pouvez protéger des applications. Aussi à cause de cela j'ai des doutes que cette solution fonctionne dans tous les cas; fondamentalement, il compile un blob comme un bloc de code et ensuite le code qui l'utilise comme un bloc de données... iirc qui ne devraient travailler que si l'exécutable/DLL bloc est marqué comme.text
- qui, au fond, est (toujours) la marque comme un bloc de données.ld
qui nom de symbole pour générer les données?&_binary_foo_bar_end - &_binary_foo_bar_start + 1
? Le nombre d'éléments dans la gamme[a, b]
estb - a + 1
.Ainsi que les suggestions déjà mentionné, sous linux, vous pouvez utiliser le dump de l'outil xxd, qui dispose d'une fonctionnalité permettant de générer un fichier en-tête C:
La
.incbin
directive GAZ peut être utilisé pour cette tâche. Voici un site totalement gratuit est homologué à la bibliothèque qui s'enroule autour de lui:https://github.com/graphitemaster/incbin
Pour résumer. Le incbin méthode est comme ça. Vous avez une chose.s de l'assemblée fichier que vous compiler avec gcc-c chose.s
Dans votre c ou cpp code, vous pouvez référencer avec:
Vous avez alors le lien qui en résulte .o avec le reste des unités de compilation.
Le crédit à qui est due à @John Ripley avec sa réponse ici: C/C++ avec GCC: Statique ajouter des fichiers de ressources de l'exécutable/bibliothèque
Mais la ci-dessus n'est pas aussi pratique que ce incbin peut vous donner. Pour y parvenir avec incbin vous n'avez pas besoin d'écrire de l'assembleur. Seulement, la suite ne:
Vous pourriez le faire dans un fichier d'en-tête :
et simplement l'inclure.
Autre façon de faire est de lire le fichier shader.
const char shader[] = "source";
à la place.""
citations dans chaque ligne séparément, ou d'avoir une barre oblique à la fin de chaque ligne. Ne pas oublier les autres avantages d'avoir le shader disponibles en tant que fichier autonome au cours du développement (coloration de la syntaxe, au moins?).