Hi all,

I find a strange things: Whether DIE(Debug Information Entry) of a
"static const int" member in a class has the attribute
"DW_AT_const_value" depends on whether there is a virtual function
defined in the class. Is it a expected behavior for GCC? And the
attribute "DW_AT_const_value" matters because GDB could print the
member's address if it does not have the attribute, otherwise GDB
could not.

My test case is as following:
// symbol.cpp
class Test{
private:
    const static int hack;
public:
    virtual void get(){}
};

const int Test::hack = 3;

int main()
{
    Test t;
    return 0;
}

Then I run the following steps:
$ g++ -g -o symbol symbol.cpp
$ readelf -wi symbol
The DIE for Test::hack is as follwing:
<2><46>: Abbrev Number: 4 (DW_TAG_member)
   <47>   DW_AT_name        : (indirect string, offset: 0x3a): hack
   <4b>   DW_AT_decl_file   : 1
   <4c>   DW_AT_decl_line   : 8
   <4d>   DW_AT_MIPS_linkage_name: (indirect string, offset: 0x3f):
_ZN4Test4hackE
   <51>   DW_AT_type        : <0xc3>
   <55>   DW_AT_external    : 1
   <56>   DW_AT_accessibility: 3       (private)
   <57>   DW_AT_declaration : 1
   <58>   DW_AT_const_value : 3

If I delete the function get() from the class, the class turns into:
class Test{
private:
    const static int hack;
};

const int Test::hack = 3;

int main()
{
    Test t;
    return 0;
}

Then the DIE for Test::hack does not have the attribute
"DW_AT_const_value". Is it exptected?  Thank you!

Reply via email to