2010-05-24 11 views
7

Je suis actuellement à la recherche d'un moyen d'ajouter des données à un exécutable ELF déjà compilé, c'est-à-dire d'incorporer un fichier dans l'exécutable sans le recompiler.Emballage d'un fichier dans un exécutable ELF

Je pourrais facilement faire cela en utilisant cat myexe mydata > myexe_with_mydata, mais je ne pouvais pas accéder aux données de l'exécutable, car je ne connais pas la taille de l'exécutable d'origine.

Quelqu'un at-il une idée de la façon dont je pourrais mettre en œuvre cela? J'ai pensé ajouter une section à l'exécutable ou utiliser un marqueur spécial (0xBADBEEFC0FFEE par exemple) pour détecter le début des données dans l'exécutable, mais je ne sais pas s'il y a une plus belle façon de le faire.

Merci d'avance.

Répondre

5

Vous pouvez ajouter le fichier au fichier elfe comme une section spéciale avec objcopy (1):

objcopy --addsection sname=file oldelf newelf 

ajoutera le fichier à oldelf et écrire les résultats à newelf (oldelf ne sera pas modifié) Vous pouvez ensuite utiliser libbfd pour lire le fichier elf et extraire la section par son nom, ou simplement lancer votre propre code qui lit la table de section et trouve votre section. Assurez-vous d'utiliser un nom de section qui n'entrera pas en collision avec tout ce que le système attend - tant que votre nom ne commence pas par ., ça devrait aller.

+0

Je ne savais pas que objcopy pouvait le faire! Merci. –

1

J'ai créé une petite bibliothèque appelée elfdataembed qui fournit une interface simple pour extraire/référencer des sections incorporées en utilisant objcopy. Cela vous permet de passer le décalage/taille à un autre outil, ou de le référencer directement à partir du runtime en utilisant des descripteurs de fichiers. J'espère que cela aidera quelqu'un dans le futur. Il est important de noter que cette approche est plus efficace que la compilation vers un symbole, car elle permet aux outils externes de référencer les données sans avoir besoin d'être extraites, et elle ne nécessite pas non plus le chargement complet de la mémoire binaire extraire/référencer.

Questions connexes