在Java中:给定COFF/ELF/DWARF可执行文件,以编程方式确定C/C++变量的地址

Jas*_*n S 5 java executable coff elf dwarf

这是我偶尔遇到的情况:

对于不使用虚拟寻址的嵌入式系统,我有一个可执行文件,它是用C或C++代码编译的,包含调试信息.它通常在COFF或ELF/DWARF(我得到那两个混合)格式.

在运行时,在PC上,我想确定给定名称的变量的地址.(例如"foo.bar [7] .baz")这允许我在嵌入式系统上读/写变量的值(给定一个超出本问题范围的调试协议).显然,任何基于堆栈或基于堆的变量都没有,因为它们没有静态地址.

我之前在C++中已经完成了这项工作,用于解析TI编译器为其2800系列DSP编写的COFF文件,这有点痛苦.我想知道是否有一个Java库已经做了这种事情,因为我面对着一个或两个其他处理器的可执行文件.


更新:(11/18/2009)一个有希望的线索!

有没有人使用Eclipse CDT ELF解析器?

(见http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc.isv/reference/api/org/eclipse/cdt/core/model/IBinary.html一的javadoc pgs)

TI的Code Composer 4(基于Eclipse)似乎使用了这个,所以似乎我可以弄清楚文档的位置,也许我可以用它来解决我的问题.

sig*_*ice 2

gdb 支持您的目标 CPU 吗?

如果是,那么实现调试协议并与目标对话的程序也可以实现GDB 远程串行协议并提供 TCP 套接字供 gdb 进行通信。

安排会是这样的

gdb <--gdb协议--> java-prog <--你的调试协议-->目标

要运行整个过程,假设您的目标已经在运行您的程序

  1. 运行java-prog
  2. 运行gdb your-executable并连接到 java-prog

    (gdb) 目标远程 127.0.0.1:端口

  3. 要求 gdb 读取一个值

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

这被转换为 gdb 数据包,并通过 TCP 发送到 java-prog。java-prog 应该在 gdb 协议和您的自定义调试协议之间进行转换。