DWARF - это в значительной степени представление о том, что компилятор знает об исходной программе. Итак, общий ответ на этот вопрос: если вы можете найти размер «локально» в источнике, тогда да; в противном случае нет.
Но в этом случае, если мы удалим ...
s из вашей программы и скомпилируем его, мы можем просто прочитать DWARF напрямую, используя readelf
.
Вот что testarray
в main
выглядит следующим образом:
<2><5c>: Abbrev Number: 3 (DW_TAG_variable)
<5d> DW_AT_name : (indirect string, offset: 0x5): testarray
<61> DW_AT_decl_file : 1
<62> DW_AT_decl_line : 7
<63> DW_AT_type : <0x7f>
<67> DW_AT_location : 2 byte block: 91 60 (DW_OP_fbreg: -32)
...
<1><7f>: Abbrev Number: 7 (DW_TAG_array_type)
<80> DW_AT_type : <0x78>
<84> DW_AT_sibling : <0x8f>
<2><88>: Abbrev Number: 8 (DW_TAG_subrange_type)
<89> DW_AT_type : <0x8f>
<8d> DW_AT_upper_bound : 5
<2><8e>: Abbrev Number: 0
<1><8f>: Abbrev Number: 6 (DW_TAG_base_type)
<90> DW_AT_byte_size : 8
<91> DW_AT_encoding : 7 (unsigned)
<92> DW_AT_name : (indirect string, offset: 0x60): sizetype
То есть, это массив из 6 символов. Таким образом, в этом случае вы можете найти длину - именно то, что вы ожидаете от чтения источника.
Однако teststr
и переменные в func
выглядеть как:
<2><4e>: Abbrev Number: 3 (DW_TAG_variable)
<4f> DW_AT_name : (indirect string, offset: 0xf): teststr
<53> DW_AT_decl_file : 1
<54> DW_AT_decl_line : 6
<55> DW_AT_type : <0x72>
<59> DW_AT_location : 2 byte block: 91 68 (DW_OP_fbreg: -24)
...
<1><72>: Abbrev Number: 5 (DW_TAG_pointer_type)
<73> DW_AT_byte_size : 8
<74> DW_AT_type : <0x78>
<1><78>: Abbrev Number: 6 (DW_TAG_base_type)
<79> DW_AT_byte_size : 1
<7a> DW_AT_encoding : 6 (signed char)
<7b> DW_AT_name : (indirect string, offset: 0x7d): char
Это говорит о том, что это просто указатель на гольца - другими словами, длина не статически известна. Отладчик, такой как gdb, может найти длину во время выполнения, читая память у низшего, как и ваша программа.
Спасибо! Можете ли вы объяснить, как мы можем сказать, что testarray представляет собой массив из 6 символов из вышеупомянутой информации DWARF? Если я думаю, что это правильно, мы можем сказать это из «DW_AT_upper_bound». Тогда мой вопрос заключается в том, что в основном есть несколько массивов, как мы можем сопоставить разные «DW_AT_upper_bound» с соответствующим соответствующим массивом? –
Все зависит от типа. Сначала вы можете найти запись для переменной 'testarray' - DIE 0x5c. Затем посмотрите на тип массива DIE 0x7f. Тип - это тип массива, поэтому просмотрите границы. Нижняя граница равна 0 (она не является явной, но вы можете знать ее на основе языка CU), а верхняя граница - 5, поэтому длина равна 6. Другие массивы в функции будут иметь свои собственные типы с собственными границами , –