2013-05-31 5 views
2

J'ai un projet qui nécessite un tas de fichiers graphiques dans l'exécutable. Comme il n'y a pas de système de fichiers sur la cible, je ne peux pas utiliser la fonction fopen. Un moyen serait convertir le contenu du fichier à un code source C qui contient la définition des variables comme celui-ciComment ajouter des ressources binaires

unsigned char file1_content[] = { 
    0x01, 0x02, ... 
}; 

Il est lourd à construire de tels fichiers, même avec un outil de conversion.

Est-il possible d'ajouter des fichiers binaires à la section rdata tout en spécifiant un nom de variable pour chaque fichier? Je pense à utiliser le script de l'éditeur de liens pour cela, mais je n'ai pas trouvé de solution.

Répondre

2

Ce n'est pas particulièrement compliqué avec un outil, et c'est la solution classique. Search for "bin2c" pour en trouver.

Vous devez simplement inclure ces étapes de «création d'actifs» dans votre processus de construction, c'est-à-dire appeler l'outil à partir du fichier Makefile. Cela signifie également que l'outil n'est exécuté que si les données sources ont changé, ce qui est bien.

Au moins l'éditeur de liens GNU (LD) semble capable de placer des fichiers dans les sections du fichier de sortie (voir le Section Placement documentation, comme ceci:

.data : { afile.o bfile.o cfile.o } 

Mais cela semble assez lourd, et il a besoin de vous Pensez aux sections de votre fichier exécutable qui sont souvent de niveau trop bas, et il semble que les entrées doivent être des fichiers objets, ce qui rend le problème circulaire car un actif binaire générique n'est pas un éditeur de liens. fichier objet compatible

Je recommanderais d'utiliser l'approche bin2c

1

Vous peut utiliser l'option de liaison --format avec -Wl, pour passer à linker, comme:

gcc -Wl,--format=binary -Wl,myfile.bin -Wl,--format=default 

Format Dernière mise par défaut vous permet de passer linker retour au format d'entrée standard.

Vous pouvez accéder à vos ressources binaires provenant de sources via symbole simple assembleur _binary_myfile_bin_start (pour myfile.bin, pour xxx.yyy il sera _binary_xxx_yyy_start et _binary_xxx_yyy_end) comme:

Et la prochaine utilisation data. Il est préférable de faire l'objcopie par vous-même ou d'utiliser le piratage des ressources.

màj: L'expansion avec un petit exemple - principales sorties quatre premiers octets de son propre fichier d'objet:

#include "stdio.h" 
#include "stdint.h" 

extern uint8_t data[] asm("_binary_main_o_start"); 

int 
main(void) 
{ 
    fprintf(stdout, "0x%x, 0x%x, 0x%x, 0x%x\n", data[0], data[1], data[2], data[3]); 
    return 0; 
} 

Maintenant compilez une course:

$ gcc -o main.o -c main.c 
$ gcc -o main main.o -Wl,--format=binary -Wl,main.o -Wl,--format=default 
$ ./main 
0x7f, 0x45, 0x4c, 0x46 
+0

Comment peut-je obtenir le symbole xxx_end ou la taille du binaire? – harper

+0

La fin des données est marquée par l'éditeur de liens en tant que '_binary_xxx_yyy_end'' et la taille est marquée comme' '_binary_xxx_yyy_size'' –

+0

Puis-je créer une bibliothèque (.ar) contenant des éléments construits à partir des fichiers binaires? Enfin, je voudrais lier cette bibliothèque de binaires. – harper

Questions connexes