Hi folks,
This email is part bug report and part question. I wanted to share
what I found while debugging this issue in order to helps someone that
would tackle this issue in the future.
I want to retrieve the parameters of a binary that has been compile
with gcc -O2 optimization option.
I made a dummy program (mutatee.c in the attached archive) that
contains a function named foo that has one parameter. I was wondering
why I was not able to get the parameter's name, type and eventually
value with my mutator program. So, I activated the
DYNINST_DEBUG_DWARF=1 env var to examine what was happening.
http://paste.ubuntu.com/7809741/. We can see on line 655 that there is
a failure parsing the third entry of the location list for the bar
variable.
Here is the function foo:
void __attribute__((noinline, noclone))
foo(int bar)
{
printf("%d",bar);
return;
}
Using the following: objdump --dwarf=info mutatee
We can find the entry for the foo function and find the bar parameter
at the 0x2ec offset.
<1><2cf>: Abbrev Number: 17 (DW_TAG_subprogram)
<2d0> DW_AT_external : 1
<2d0> DW_AT_name : foo
<2d4> DW_AT_decl_file : 1
<2d5> DW_AT_decl_line : 8
<2d6> DW_AT_prototyped : 1
<2d6> DW_AT_low_pc : 0x400650
<2de> DW_AT_high_pc : 0x13
<2e6> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa)
<2e8> DW_AT_GNU_all_call_sites: 1
<2e8> DW_AT_sibling : <0x34b>
<2><2ec>: Abbrev Number: 18 (DW_TAG_formal_parameter)
<2ed> DW_AT_name : bar
<2f1> DW_AT_decl_file : 1
<2f2> DW_AT_decl_line : 8
<2f3> DW_AT_type : <0x5e>
<2f7> DW_AT_location : 0x0 (location list)
We see at the last line that the DW_AT_location of the foo formal
parameter is a location list at offset 0x0 in the loc table which we
can examine using: objdump --dwarf=loc mutatee
00000000 0000000000400650 000000000040065c (DW_OP_reg5 (rdi))
00000013 000000000040065c 0000000000400662 (DW_OP_reg1 (rdx))
00000026 0000000000400662 0000000000400663 (DW_OP_GNU_entry_value:
(DW_OP_reg5 (rdi)); DW_OP_stack_value)
So from my understanding, we aren't able to correctly parse the third
entry of the location list. Digging in the code I found that the
keyword
DW_OP_GNU_entry_value is not handle by the switch case in
dwarf/src/dwarfExprParser.C:126.it then falls in the default case and
then return false.
This behavior causes the mutator to return an empty vector when asked
for the parameters of the function.
My setup:
gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)
Dyninst branch v8.2
Is this an issue that is within Dyninst's control, more related to
libdwarf or something else?
Thanks,
Francis
Attachment:
list-parameters.tar.gz
Description: GNU Zip compressed data
|