2016-10-05 12 views

ответ

0

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, может найти длину во время выполнения, читая память у низшего, как и ваша программа.

+0

Спасибо! Можете ли вы объяснить, как мы можем сказать, что testarray представляет собой массив из 6 символов из вышеупомянутой информации DWARF? Если я думаю, что это правильно, мы можем сказать это из «DW_AT_upper_bound». Тогда мой вопрос заключается в том, что в основном есть несколько массивов, как мы можем сопоставить разные «DW_AT_upper_bound» с соответствующим соответствующим массивом? –

+0

Все зависит от типа. Сначала вы можете найти запись для переменной 'testarray' - DIE 0x5c. Затем посмотрите на тип массива DIE 0x7f. Тип - это тип массива, поэтому просмотрите границы. Нижняя граница равна 0 (она не является явной, но вы можете знать ее на основе языка CU), а верхняя граница - 5, поэтому длина равна 6. Другие массивы в функции будут иметь свои собственные типы с собственными границами , –