в Java: программное определение адресов переменных C / C ++ по заданному исполняемому файлу COFF / ELF / DWARF - PullRequest
5 голосов
/ 03 апреля 2009

Это ситуация, с которой я сталкиваюсь время от времени:

Для встроенной системы, которая не использует виртуальную адресацию, у меня есть исполняемый файл, который был скомпилирован из кода C или C ++ с включенной информацией об отладке. Обычно это в формате COFF или ELF / DWARF (я их перепутал).

Во время выполнения на ПК я хотел бы определить адрес переменной по ее имени. (например, "foo.bar [7] .baz") Это позволяет мне читать / записывать значение переменной во встроенной системе (учитывая протокол отладки, который выходит за рамки этого вопроса). Очевидно, что любые переменные, основанные на стеке или куче, отсутствуют, поскольку у них нет статических адресов.

Я сделал это перед собой в C ++, чтобы проанализировать файлы COFF от компилятора TI для их DSP серии 2800, и это было довольно болезненно. Мне было интересно, существует ли библиотека Java, которая уже занимается подобными вещами, поскольку я сталкиваюсь с той же проблемой с исполняемыми файлами одного или двух других процессоров.


Обновление: (18.11.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 4 (основанный на Eclipse), кажется, использует это, таким образом, похоже, что если я могу выяснить, где находится документация, возможно, я смогу использовать это для решения моей проблемы.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2009

GDB поддерживает ваш целевой процессор?

Если да, ваша программа, которая реализует протокол отладки и обращается к цели, может также реализовать Удаленный последовательный протокол GDB и предоставить сокет TCP для связи с gdb.

Аранжировка будет примерно такой

gdb <- протокол gdb -> java-prog <- ваш протокол отладки -> цель

Чтобы выполнить все это, предполагая, что ваша цель уже запускает вашу программу

  1. Запустите Java-прогу
  2. Запустите gdb your-executable и подключитесь к java-проге

    (gdb) целевой удаленный 127.0.0.1:port

  3. Попросить GDB прочитать значение

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

Это транслируется в пакеты gdb, которые отправляются в java-prog по TCP. java-prog должен выполнить перевод между протоколом gdb и вашим настраиваемым протоколом отладки.

1 голос
/ 04 апреля 2009

Вы можете создать интерфейс JNI для GNU binutils , скомпилированных для вашей платформы. Однако, если GPL конфликтует с лицензией на ваше программное обеспечение, это не будет жизнеспособным решением.

...