как добраться от строки в разобранном разделе .text в файле ELF до соответствующей строки в исходном коде - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать программу покрытия линий в Python.

Цель состоит в том, чтобы получить список компьютеров из теста, запущенного на устройстве, и получить информацию о том, какие функции, условия и линии FW указанного устройства были охвачены тестом.

Указанное устройство имеет процессор AR C, если это помогает.

У меня есть двоичные файлы ELF и исходный код (написанный на C), но не могу поделиться ими здесь (конфиденциальная информация о компании).

Я взял файл ELF и сумел получить разборку раздела .text (по сути, это код сборки программы).

Я разобрал FW устройства, поэтому я разобрал FW следующим образом:

P C: hex_opcode assembly_command operands

вот так:

0x100: 7eff mov a, b

Кроме того, используя pyelftools от Eli Bendersky: https://github.com/eliben/pyelftools

Мне удалось получить исходный файл и строку номер начала функции, поэтому я ч Ave удалось сопоставить код сборки каждой функции с источником.

И используя High P C и Low P C из функций, мне удалось связать ПК из журналов испытаний с функциями.

Но теперь я застрял, пытаясь сопоставить отдельные сборочные линии к их расположению в C исходном коде.

Я знаю, что для этого мне нужно прочитать информацию в .debug_line в DWARF, но я не совсем понимаю ее.

Мне удалось встретиться с этим:

https://wiki.osdev.org/DWARF

Где они говорят: Линия + = База линии + (Код операции - База кода операции)% Диапазон линии

У меня есть вся информация, кроме Line и Opcode.

Под "Line" они подразумевают начальную строку в функции? (например, если в источнике файла находится «void fun c ()». c строка 5) Предыдущая строка?

А по «коду операции» это основной код операции команды сборки? Или полный код команды сборки (например, 0x7eff в двоичном представлении) Что-то еще? Некоторые другие коды операций из информации DWARF?

Расчет, насколько я понял, выполняется в десятичном формате, поэтому код операции должен быть преобразован в десятичный.

Заранее спасибо за помощь.

Вадим

1 Ответ

1 голос
/ 22 апреля 2020

Но сейчас я застрял, пытаясь сопоставить отдельные сборочные линии с их расположением в C исходном коде.

Вам нужны две вещи:

  1. Сборка вашей прошивки с отладочной информацией. Обычно вы просто хотите добавить -g ко всем существующим строкам компиляции и компоновки.

    Примечание: не удаляйте , а все флаги оптимизации, иначе скомпилированный код больше не будет соответствовать двоичному файлу, для которого вы собрали покрытие.

    Примечание: если ваш процесс сборки запускается strip, вам нужно сохранить двоичный файл до того, как удалит его.

  2. Используйте decode_file_line из dwarf_decode_address.py , чтобы отобразить каждый адрес (P C), который вы собрали, в файл, пару строк.

...