2009-04-03 6 views
5

Diese Situation ist ich in jetzt laufe und dann:in Java: programmatisch Adressen von C/C++ Variablen gegeben einer COFF/ELF/DWARF ausführbare Bestimmung

Für ein eingebettetes System, das nicht virtuelle Adressierung nicht verwendet, ich habe eine ausführbare Datei, die aus C- oder C++ - Code kompiliert wurde und Debugging-Informationen enthielt. Es ist normalerweise in COFF oder ELF/DWARF (ich bekomme diese beiden durcheinander) Format.

Zur Laufzeit auf einem PC möchte ich die Adresse einer Variablen anhand ihres Namens ermitteln. (z. B. "foo.bar [7] .baz") Dies ermöglicht es mir, den Wert der Variablen auf dem eingebetteten System zu lesen/schreiben (angesichts eines Fehlersuchprotokolls, das außerhalb des Bereichs dieser Frage liegt). Offensichtlich sind alle Variablen, die stapelbasiert oder heap-basiert sind, out, da sie keine statischen Adressen haben.

Ich habe dies vor mir selbst in C++ getan, um COFF-Dateien von TI Compiler für ihre 2800-Serie DSPs zu analysieren, und es war ein bisschen Schmerz. Ich habe mich gefragt, ob es da draußen eine Java-Bibliothek gibt, die sowas schon tut, da ich mit den ausführbaren Dateien von ein oder zwei anderen Prozessoren genauso konfrontiert bin.


Update: (11/18/2009) ein vielversprechender Hinweis!

Hat jemand den Eclipse CDT ELF Parser benutzt?

(Siehe http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc.isv/reference/api/org/eclipse/cdt/core/model/IBinary.html für eine der javadoc PGS)

TI Code Composer 4 (basierend auf Eclipse) scheint dies zu verwenden, so scheint es, wie wenn ich herausfinden kann, wo die Dokumentation kann ich vielleicht ist zu verwenden, dass um mein Problem zu lösen.

Antwort

2

Unterstützt gdb Ihre Ziel-CPU?

Wenn ja, könnte Ihr Programm, das das Debugging-Protokoll implementiert und mit dem Ziel kommuniziert, auch die GDB Remote Serial Protocol implementieren und einen TCP-Socket für die Kommunikation mit gdb bereitstellen. > Java-prog < --Euer Debug-Protokoll - -

Die Anordnung wäre so etwas wie dies

gdb < --gdb Protokoll sein> Ziel

das Ganze ausführen zu können, vorausgesetzt, Ihr Ziel läuft bereits Ihr Programm

  1. Run Java-prog
  2. Run gdb your-executable und eine Verbindung zu java-prog

    (GDB) Zielfern 127.0.0.1:port

  3. gdb Stellen Sie eine Wert

    (GDB) p foo.bar [7]

Diese übersetzt .baz zu lesen ist zu gdb-Paketen, die über TCP an java-prog gesendet werden. java-prog sollte die Übersetzung zwischen dem gdb-Protokoll und Ihrem benutzerdefinierten Debug-Protokoll durchführen.

1

Sie könnten eine JNI-Schnittstelle zu GNU binutils erstellen, die für Ihre Plattform kompiliert wurde.Wenn die GPL jedoch mit der Lizenz Ihrer Software kollidiert, ist dies keine praktikable Lösung.

+0

kommt leider GPL nicht in Frage, aber danke für die Idee. –

+0

Ich denke, es ist immer noch sehr nützlich für das Testen gegen welche Implementierung ich am Ende benutze. –

Verwandte Themen