3

私のコードは次のようになります:

mod_fd = open(mod_filename, O_RDONLY);
dwarf = dwarf_begin(mod_fd, DWARF_C_READ);

if (dwarf_next_unit(dwarf, 0,
                        &nextcu, &offset,
                        &version, &abbroffset,
                        &addrsize, &offsize,
                        NULL, NULL)) {
    return -ENOENT;
}

/* compile unit */
if (!dwarf_offdie(dwarf, offset, &die_of_cu)) {
    return -ENOENT;
}

if(dwarf_attr(die, DW_AT_name, &attr)) {

et_trace(CONFIG_ET_TRACE,
             "0x%lx name form: 0x%x: %p 0x%x, %s\n",
             dwarf_dieoffset(die),
             attr.form,
             attr.valp,
             *(int*)attr.valp,
             dwarf_formstring(&attr));

    switch(attr.form) {
        case DW_FORM_indirect://0x16
        case DW_FORM_strp:    //0xe
        case DW_FORM_string:  //0x8
            return dwarf_formstring(&attr);
        default:
            my_assert(0);
            break;
    }
}

ユーザー モード アプリの場合mod_filename、すべてがうまくいき、次のようになります。

0xb name form: 0x8: 0x7f9753f9f2fe 0x6f727473, strobj.c
0x172 name form: 0x8: 0x7f9753f9f458 0x6f727473, strobj_t
0x183 name form: 0x8: 0x7f9753f9f469 0x66667562, buff

ただし、mod_filenameがカーネル モジュール (つまり、カーネル モジュール*.ko*.oビルド中に生成された ) である場合は、機能せず、次のようになります。

0xb name form: 0xe: 0x7fa5b8bc94c1 0x0, __kernel_size_t
0x4b name form: 0xe: 0x7fa5b8bc94fc 0x0, __kernel_size_t
0x123 name form: 0xe: 0x7fa5b8bc95d4 0x0, __kernel_size_t
0x755 name form: 0xe: 0x7fa5b8bc9c06 0x0, __kernel_size_t

後者はずっとゼロだったので、*(int*)attr.valp正しくありませんが理由はわかりません。

誰か知ってる?助けて。ありがとう。

4

0 に答える 0