This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Compilation Unit name


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<Dwarf_Off> 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<Dwarf_Off> 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
        }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]