Hello guys,
I work for Dyninst, and I am moving from libdwarf to libdw. I am trying to get
the compilation unit name calling dwarf_nextcu, dwarf_offdie and
dwarf_diename, but it won't work as it works with libdwarf. I got NULL as
return from dwarf_diename. When I print the error messages after each of these
three function calls, I get no errors for the first two and an "invalid dwarf"
for the third one. Can you help me with it?
Below I present the snippet where I am doing the calls, both with libdwarf and
libdw.
Sasha Nicolas
//Using libdwarf
bool Object::fix_global_symbol_modules_static_dwarf()
{
/* Initialize libdwarf. */
::Dwarf **dbg_ptr = dwarf->type_dbg();
if (!dbg_ptr)
return false;
::Dwarf *dbg = *dbg_ptr;
std::set dies_seen;
dwarf_parse_aranges(dbg, dies_seen);
/* Iterate over the compilation-unit headers. */
size_t cu_header_size;
for(Dwarf_Off cu_off = 0, next_cu_off;
dwarf_nextcu(dbg, cu_off, &next_cu_off, &cu_header_size,
NULL, NULL, NULL) == 0;
cu_off = next_cu_off)
{
cerr << "Error message:" << dwarf_errmsg(-1) << endl;
Dwarf_Die cu_die, *cu_die_p;
cu_die_p = dwarf_offdie(dbg, next_cu_off /*cu_die_off*/, &cu_die);
cerr << "Error message:" << dwarf_errmsg(-1) << endl;
if(cu_die_p == NULL) continue;
if(dies_seen.find(next_cu_off/* cu_die_off*/) != dies_seen.end())
continue;
std::string modname;
auto diename = dwarf_diename(&cu_die);
cerr << "Error message:" << dwarf_errmsg(-1) << endl;
if(diename == NULL)
{
modname = associated_symtab->file(); // default module
}
else
{
modname = diename;
}
...
//Using libdwarf
bool Object::fix_global_symbol_modules_static_dwarf()
{
/* Initialize libdwarf. */
Dwarf_Debug *dbg_ptr = dwarf->type_dbg();
if (!dbg_ptr)
return false;
Dwarf_Debug dbg = *dbg_ptr;
std::set dies_seen;
Dwarf_Off cu_die_off;
Dwarf_Die cu_die;
dwarf_parse_aranges(dbg, dies_seen);
/* Iterate over the compilation-unit headers. */
while (dwarf_next_cu_header_c(dbg, Dwarf_Bool(true),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,
&cu_die_off, NULL) == DW_DLV_OK )
{
int status = dwarf_siblingof_b(dbg, NULL, Dwarf_Bool(true), &cu_die,
NULL);
assert(status == DW_DLV_OK);
if(dies_seen.find(cu_die_off) != dies_seen.end()) continue;
std::string modname;
if(!DwarfWalker::findDieName(dbg, cu_die, modname))
{
modname = associated_symtab->file(); // default module
}