2009-04-03 13 views
5

Ésta es una situación me encuentro de vez en cuando:en Java: determinar mediante programación direcciones de C/variables de C++ da un COFF/ELF/ejecutable ENANO

Para un sistema integrado que no utiliza direccionamiento virtual, tengo un archivo ejecutable que se compiló desde el código C o C++ con información de depuración incluida. Por lo general, está en formato COFF o ELF/DWARF (obtengo esos dos mezclados).

En tiempo de ejecución, en una PC, me gustaría determinar la dirección de una variable dado su nombre. (por ejemplo, "foo.bar [7] .baz") Esto me permite leer/escribir el valor de la variable en el sistema incorporado (dado un protocolo de depuración que está más allá del alcance de esta pregunta). Obviamente, todas las variables que están basadas en pila o en heap están fuera ya que no tienen direcciones estáticas.

He hecho esto antes que yo en C++ para analizar los archivos COFF del compilador de TI para sus DSP de la serie 2800, y fue un poco molesto. Me preguntaba si había una biblioteca de Java que hace este tipo de cosas, ya que estoy enfrentando lo mismo con los archivos ejecutables de uno o dos procesadores.


Actualización: (11/18/2009) Una pista prometedora!

¿Alguien ha usado el analizador Eclipse CDT ELF?

(Ver http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc.isv/reference/api/org/eclipse/cdt/core/model/IBinary.html para una de las páginas javadoc)

Código de TI Compositor 4 (basado en Eclipse) parece usar esto, así que parece que si puedo averiguar donde la documentación es tal vez pueda utilizar ese para resolver mi problema

Respuesta

2

¿Admite gdb su CPU objetivo?

En caso afirmativo, su programa que implementa el protocolo de depuración y habla con el destino también podría implementar el GDB Remote Serial Protocol y proporcionar un socket TCP para comunicarse con gdb.

La disposición sería algo como esto

GDB < protocolo --gdb -> java-prog < --su protocolo de depuración -> Destino

Para ejecutar todo el asunto, asumiendo que su objetivo ya se está ejecutando su programa

  1. Ejecutar java-prog
  2. Run gdb your-executable y conectarse a java-prog

    (GDB) de destino remoto 127.0.0.1:port

  3. Pregunta gdb para leer un valor

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

Esto se traduce a los paquetes gdb que se envían a java-prog a través de TCP. java-prog debe hacer la traducción entre el protocolo gdb y su protocolo de depuración personalizado.

1

Puede construir una interfaz JNI a GNU binutils compilada para su plataforma.Sin embargo, si la GPL entra en conflicto con la licencia de su software, entonces esta no será una solución viable.

+0

Desafortunadamente GPL está fuera de lugar, pero gracias por la idea. –

+0

Supongo que todavía es muy útil para probar contra cualquier implementación que termine usando. –

Cuestiones relacionadas