Учитывая бинарный файл ELF, построенный из C ++ с gcc, как я могу определить размер некоторого типа в нем? - PullRequest
2 голосов
/ 21 апреля 2010

Есть ли способ использовать инструменты binutils, чтобы получить это? Например:

// x.cc
typedef long long MyInt;
int main(int argc, char* argv[]) {
  // blah blah blah
}

Тогда:

g++ -g x.cc -o a.out

Как я могу проанализировать a.out, чтобы получить sizeof (MyInt)? GDB может это сделать, но я не хочу использовать GDB, потому что он очень медленный для больших двоичных файлов.

Ответы [ 3 ]

1 голос
/ 15 августа 2010

readelf способен вывести отладочную информацию дварфа:

readelf -wi

Найдите элемент DW_TAG_variable, значение которого DW_AT_name равно MyInt и является непосредственным дочерним элементом элемента DW_TAG_compile_unit, представляющего этот модуль компиляции.

Используйте атрибут DW_AT_type для поиска DW_TAG_base_type этой переменной. Атрибут DW_AT_type - это смещение от начала этого CU, где хранится информация об этом типе. Эти смещения перечислены слева на выходе (в <> с). Посмотрите на атрибут DW_AT_byte_size этого DIE. Это размер шрифта в байтах.

0 голосов
/ 21 апреля 2010

Вам нужно будет сделать то, что делает GDB, и прочитать информацию отладки DWARF для себя. Есть несколько инструментов, которые могут помочь с этим, таких как readelf и dwarfdump. Читайте FAQ и другие полезности на http://dwarfstd.org/ и посмотрите, будет ли это делать то, что вам нужно.

В этом ответе предполагается, что вы работаете на платформе vanilla Linux. Существуют и другие инструменты для других платформ, которые также могут работать для вас, но я не тот, кто спрашивает об этом.

0 голосов
/ 21 апреля 2010

Я бы сказал, что для этого лучше придерживаться GDB.

bintuls имеет дело в основном с исполняемым форматом (ELF) - материал для отладки хранится в формате dwarf . Кроме запуска objdump -g -x yourbinary Я не видел много утилит, имеющих дело с символами отладки.

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

...