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] |
Do you have the whole call stack of that failed __libdw_read_offset call? Which source line in tests/dwarf-getmacros.c prints the "(null)"?Actually I just managed to catch a backtrace by inserting an infinite loop at the point where it would normally return -1. It turns out the address we are looking for is not in the IDX_debug_info section, but in the IDX_debug_macro section (which by itself isn't all that surprising, but if that is a rule, how can this code ever work??).
The likely solution of the mystery is this piece of code in __libdw_in_section:
if (unlikely (addr < data->d_buf) || unlikely (data->d_size - (addr - data->d_buf) < size)) { __libdw_seterrno (DWARF_E_INVALID_OFFSET); return false; }If addr < data->d_buf we fail immediately. That's what's happening to me sometimes. However, if addr > data->d_buf, then it's likely much bigger, as the allocations of the different sections are unrelated. data->d_size is always 159 in this test case. Therefore, data->d_size - (addr - data->d_buf) will produce something negative, which then gets compared to a size_t, forcing it to overflow. size is 4, so this case never gets detected.
Ulf
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |