2017-05-21 5 views
1

Je dois effectuer objdump sur un ELF pour obtenir l'adresse et/ou les tailles de fonctions et variables spécifiques ainsi que objcopy pour le convertir en un format différent pour les opérations effectuées plus tard. Surtout avec la première partie, certaines des opérations effectuées sur le résultat de objdump sont un peu complexes, donc je suis allé avec la création d'une petite application C++ pour cela. Cela fonctionne, cependant il appelle actuellement objdump et objdopy de gcc directement en incluant ses paramètres avec un appel system.objdump et objcopy en tant que bibliothèque c/C++

Il y a plusieurs raisons pour lesquelles je n'aime pas cette approche, dont la principale est que je dois compter sur l'utilisation de l'ordinateur sur le PC ou les distribuer avec mon propre exécutable et le traiter comme une sorte de dynamique bibliothèque, mais sous forme d'exécutables, que je n'aime pas non plus. Ma question est, existe-t-il une forme de bibliothèque (gcc?) Que je pourrais (de préférence statiquement) lier pour effectuer les mêmes opérations de cette façon? Je préfèrerais utiliser quelque chose de très proche de gcc, surtout quand il s'agit de compatibilité avec les fichiers gcc produits en entrée et en donnant la même sortie, car j'ai déjà ce genre de version de mon propre exécutable.

+0

Quel est le problème que vous essayez de résoudre? * Pourquoi * faites-vous/en avez-vous besoin? –

+0

Donc, vous voulez essentiellement réécrire des parties de 'objdump/objcpy'? Ensuite, vous voudrez probablement jeter un coup d'œil à [libbfd] (ftp://ftp.gnu.org/old-gnu/Manuals/bfd-2.9.1/html_mono/bfd.html) – kaylum

+0

@JesperJuhl Je pensais que c'était pas pertinent pour la discussion mais comme vous l'avez demandé je suppose que je vais répondre. C'est parce que je travaille sur un projet embarqué (bare-metal) qui nécessite d'effectuer quelques étapes initiales avant de démarrer (ou de déboguer) l'application. En particulier, j'ai besoin de charger une partie du binaire dans une mémoire externe, qui est connectée à la MCU principale. Ceci est plus facile avec un chargeur placé temporairement dans la RAM du MCU. Cependant, le PC qui charge l'application cible (dans la mémoire interne et externe) doit connaître l'emplacement des fonctions du chargeur, d'où 'objdump'. –

Répondre

3

Tous ces outils obj * sont basés sur le BFD library. Si vous regardez comment objdump fait son truc et le copie, vous devriez être capable de faire la même chose dans votre propre code.

Une autre chose que vous pouvez faire est de simplement copier le code d'objdump et vos amis dans vos propres programmes. C'est open source et vous pouvez le faire. Tout ce dont vous avez besoin est de faire vos propres programmes aussi GPL, ce qu'ils devraient être de toute façon pour utiliser la bibliothèque BFD.

2

Les programmes objdump et objcopy ne font pas partie de gcc, ils font partie de binutils. En parlant de cela: libbfd et libopcodes font aussi partie de binutils, et ceux-ci contiennent des fonctions que vous pourriez utiliser.

+0

Merci, je vais jeter un oeil à ceux-ci. –