2009-04-03 22 views
5

Ceci est une situation que je lance en maintenant puis:en Java: programme déterminer les adresses de C/C variables de GIVEN un COFF/ELF/exécutable NAIN

Pour un système embarqué qui n'utilise pas l'adressage virtuel, je un fichier exécutable compilé à partir du code C ou C++ avec les informations de débogage incluses. C'est généralement au format COFF ou ELF/DWARF (j'obtiens ces deux mélanges).

Lors de l'exécution, sur un PC, je voudrais déterminer l'adresse d'une variable donnée son nom. (par exemple "foo.bar [7] .baz") Cela me permet de lire/écrire la valeur de la variable sur le système embarqué (étant donné un protocole de débogage qui dépasse la portée de cette question). Évidemment, toutes les variables qui sont basées sur la pile ou sur le tas sont manquantes car elles n'ont pas d'adresse statique.

Je l'ai fait avant moi en C++ pour analyser les fichiers COFF du compilateur de TI pour leurs DSP de la série 2800, et c'était un peu pénible. Je me demandais s'il existait déjà une bibliothèque Java qui fait déjà ce genre de chose, puisque je suis confrontée à la même chose avec les fichiers exécutables d'un ou deux autres processeurs.


Mise à jour: (11/18/2009) Un indice prometteur!

Quelqu'un a-t-il utilisé l'analyseur Eclipse CDT ELF?

(Voir http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc.isv/reference/api/org/eclipse/cdt/core/model/IBinary.html pour l'une des pages javadoc)

code de TI Composer 4 (basé sur Eclipse) semble utiliser, il semble que si je peux comprendre où la documentation est que je peux peut-être utiliser cette pour résoudre mon problème.

Répondre

2

Est-ce que gdb supporte votre CPU cible?

Si oui, votre programme qui implémente le protocole de débogage et parle à la cible pourrait également implémenter le GDB Remote Serial Protocol et fournir un socket TCP avec lequel gdb pourra communiquer.

L'arrangement serait quelque chose comme ça

gdb < protocole --gdb -> java-prog < --Le protocole de débogage -> target

Pour exécuter la chose, en supposant que votre cible est déjà en cours d'exécution de votre programme

  1. Run java-prog
  2. Run gdb your-executable et se connecter à java-prog

    (BDG) cible distante 127.0.0.1:port

  3. Poser GDB pour lire une valeur

    (BDG) p foo.bar [7] .baz

Ceci se traduit aux paquets gdb qui sont envoyés à java-prog sur TCP. java-prog devrait faire la traduction entre le protocole gdb et votre protocole de débogage personnalisé.

1

Vous pouvez créer une interface JNI à GNU binutils compilée pour votre plate-forme.Cependant, si la licence GPL est en conflit avec la licence de votre logiciel, cela ne sera pas une solution viable.

+0

Malheureusement GPL est hors de question, mais merci pour l'idée. –

+0

Je suppose qu'il est toujours très utile pour tester la mise en œuvre que j'utilise. –