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

在Java中:以编程方式确定C/C++;给定COFF/ELF/DWARF可执行文件的变量,java,executable,elf,coff,dwarf,Java,Executable,Elf,Coff,Dwarf,这是我偶尔遇到的情况: 对于不使用虚拟地址的嵌入式系统,我有一个可执行文件,它是由C或C++代码编译而来的,其中包含调试信息。它通常是COFF或ELF/DWARF(我把这两种格式弄混了)格式 在运行时,在PC上,我想确定给定名称的变量的地址。(例如,“foo.bar[7].baz”)这允许我在嵌入式系统上读取/写入变量的值(给定的调试协议超出了本问题的范围)。显然,任何基于堆栈或基于堆的变量都是无效的,因为它们没有静态地址 我在C++中已经这样做过,从TI编译器中解析COF文件,用于他们的280

这是我偶尔遇到的情况:

对于不使用虚拟地址的嵌入式系统,我有一个可执行文件,它是由C或C++代码编译而来的,其中包含调试信息。它通常是COFF或ELF/DWARF(我把这两种格式弄混了)格式

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

我在C++中已经这样做过,从TI编译器中解析COF文件,用于他们的2800系列DSP,这是一种痛苦。我想知道是否有一个Java库已经在做这类事情了,因为我面对的是一个或两个其他处理器的可执行文件


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

有人使用过EclipseCDTELF解析器吗

(有关其中一个javadoc PG,请参阅)


TI的CodeComposer 4(基于Eclipse)似乎使用了这一点,因此如果我能找出文档的位置,也许我可以用它来解决我的问题。

gdb支持您的目标CPU吗

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

安排是这样的

gdbjavaprog目标

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

  • 运行java程序
  • 运行gdb您的可执行文件并连接到java prog

    (gdb)目标远程127.0.0.1:端口

  • 要求gdb读取一个值

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

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

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

    不幸的是,GPL是不可能的,但感谢您的想法。我认为它对于针对我最终使用的任何实现进行测试仍然非常有用。