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

时间:2009-04-03 16:24:16

标签: java executable elf coff 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)似乎使用了这个,所以看起来我可以找出文档的位置,也许我可以用它来解决我的问题。

2 个答案:

答案 0 :(得分:2)

gdb是否支持您的目标CPU?

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

这种安排就是这样的

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

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

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

    (gdb)目标远程127.0.0.1:port

  3. 要求gdb读取值

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

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

答案 1 :(得分:1)

您可以为为您的平台编译的GNU binutils构建一个JNI接口。但是,如果GPL与您的软件许可证冲突,那么这将不是一个可行的解决方案。