Чтение DIE в файле ELF

Здравствуйте, я новичок в стандарте DWARF и формате ELF. У меня есть несколько вопросов. Я использую стандарт DWARF 2, и у меня есть довольно общее представление о том, как работают DIE, и мне нужно было больше ясности в том, как они представлены в байтах.

ELF Wiki предоставляет хорошую таблицу порядка следования байтов в заголовке программы, разделах, и сегменты. Но как правильно представить DIE в байтах для стандарта DWARF 2?

Я попытался глубоко погрузиться в документы PDF Dwarf Standards, чтобы попытаться понять, как DIE представлены в байтах. Может быть, я пропустил какой-то раздел?

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


person Ryno_XLI    schedule 21.08.2018    source источник


Ответы (2)


Формат объясняется стр. 66 в разделах 7.5.2 и 7.5.3.

Пример в приложении 2, стр. 93 намного нагляднее. :

Каждый DIE ссылается на соответствующую запись в .debug_abbrev, которая определяет данную "подпись" DIE, т.е.

  • его тип (DW_TAG_*)
  • ребенок умирает
  • его атрибут (DW_AT_*) и их форма (DW_FORM_*).

Формат DIE:

  • ссылка на аббревиатуру (LEB128 т.е. переменной длины);
  • 0 используется для окончания списка дочерних элементов;
  • одно значение для каждого атрибута (используя кодировку, связанную с данной формой).
person ysdx    schedule 21.08.2018

Я рекомендую всем, кто начинает работать с DWARF, начать с Введение в формат отладки DWARF< /а>. Это очень краткий обзор, который обеспечивает прекрасную основу для более глубокого изучения формата. Вооружившись этой информацией, скомпилируйте отладочную версию очень простой программы и сравните шестнадцатеричный дамп двух разделов ELF .debug_abbrev и .debug_info с выводом dwarfdump или readelf.

Как только вы хорошо ознакомитесь с кодировкой DIE, вы увидите, что простое удаление соответствующих байтов из .debug_info приведет к повреждению всего файла с точки зрения как DWARF, так и ELF. Например, каждый DIE идентифицируется по его относительному смещению в файле; удаление байтов одного DIE изменит смещения всех последующих DIE, и поэтому любые ссылки на них будут нарушены. Надежное решение потребует синтаксического анализа DWARF для создания внутреннего представления дерева перед удалением нежелательных узлов и записью нового DWARF. После изменения .debug_info вам нужно будет отредактировать структуру самого ELF: по крайней мере, это потребует обновления таблицы заголовков разделов, чтобы отразить новые смещения для любых смещенных разделов и обновления любых перемещений.

Если вашей главной заботой действительно является экономия места, я предлагаю вам вместо этого изучить, какие параметры компилятора у вас есть. Компиляторы Oracle Studio, например, позволяют точно управлять содержимым, включенным в DWARF. В зависимости от вашего компилятора и ОС также может быть возможно создавать файлы со сжатыми разделами DWARF (например, .zdebug_info) или даже вообще оставлять DWARF в разных файлах. Проблема раздувания DWARF хорошо известна, и если вы заинтересованы в том, чтобы самостоятельно решить ее на низком уровне, вы найдете другие предложения в введение и в более поздних версиях стандарта.

person Robert Harris    schedule 24.08.2018
comment
Ссылка DWARF не работает. - person code_dredd; 27.10.2019
comment
Странно... когда я это писал, этого не было, а теперь есть. Я предполагаю, что интернет случается ¯_(ツ)_/¯ - person code_dredd; 05.01.2020