diff options
author | Mark Wielaard <[email protected]> | 2018-05-29 23:49:21 +0200 |
---|---|---|
committer | Mark Wielaard <[email protected]> | 2018-05-31 17:03:19 +0200 |
commit | 7d6fe0a39f6ae5c516ffd63558e12b24297bf982 (patch) | |
tree | 30469e6da3f107797bb69a1d0a480eafc4ba50fd /libdw/libdw_find_split_unit.c | |
parent | b37feac1a8ceebb0748cb28d219aa8387d0885dd (diff) |
libdw: Handle split Dwarf Dies in dwarf_die_addr_die.
dwarf_die_addr_die can be used to turn an Dwarf_Die addr back into a
full Dwarf_Die, just given the original Dwarf debug handle. This now
also works for Dwarf_Dies which originated from a split Dwarf. Whenever
a split Dwarf_CU is found the Dwarf it originated from is registered
with the Dwarf that the skeleton Dwarf_CU came from. All registered
split Dwarfs are then searched by dwarf_die_addr_die if the addr didn't
match the main Dwarf or the alt Dwarf.
One limitation in this implementation is that only DIEs that come from
the main .debug_info in the .dwo are supported. Theoretically there could
also be DIEs in an .debug_type or from other/multiple (comdat) sections.
New tests are added for dwarf-4, dwarf-5, split-dwarf-4, split-dwarf-5
and version 4 and 5 dwo files.
Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'libdw/libdw_find_split_unit.c')
-rw-r--r-- | libdw/libdw_find_split_unit.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/libdw/libdw_find_split_unit.c b/libdw/libdw_find_split_unit.c index d6527e07..dc62e0d0 100644 --- a/libdw/libdw_find_split_unit.c +++ b/libdw/libdw_find_split_unit.c @@ -34,6 +34,7 @@ #include "libelfP.h" #include <limits.h> +#include <search.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> @@ -84,6 +85,14 @@ __libdw_find_split_unit (Dwarf_CU *cu) if (split->unit_type == DW_UT_split_compile && cu->unit_id8 == split->unit_id8) { + if (tsearch (split->dbg, &cu->dbg->split_tree, + __libdw_finddbg_cb) == NULL) + { + /* Something went wrong. Don't link. */ + __libdw_seterrno (DWARF_E_NOMEM); + break; + } + /* Link skeleton and split compile units. */ __libdw_link_skel_split (cu, split); |