diff options
author | Mark Wielaard <mark@klomp.org> | 2018-04-09 00:03:43 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2018-05-28 17:19:41 +0200 |
commit | 7372ccf49a83d4eb38b39fe227345d53c8219254 (patch) | |
tree | 26b01e415fa1e067ad6167bcc32a51ca83affa00 /libdw/libdw_find_split_unit.c | |
parent | 879f3a4f99dfc7f3678dc1c959e66784f21886bb (diff) | |
download | elfutils-7372ccf49a83d4eb38b39fe227345d53c8219254.tar.gz |
readelf: Find skeleton units when inspecting split .dwo (--dwarf-skeleton).
To get the right context (especially addresses) when looking at a .dwo file
we really need the skeleton file. If we can find it (simply replace .dwo
with .o) then use that to get to the split DWARF units so that libdw sets
up all relevant information to resolve.
Also adds a --dwarf-skeleton option so the user can explicitly give a
skeleton file to use (for example when all .o files are linked and removed
already). Unfortunately this might not work if libdw cannot get from the
skeleton file to the .dwo file (because they have been moved around).
In that case eu-readelf "cheats", it will link up the libdw datastructures
so that the skeleton and split DWARF units are setup correctly anyway.
This does introduce a problem when trying to cleanup the Dwarf handle
ownership graph. So we will deliberately leak memory by not closing the
underlying Dwfl in that case.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'libdw/libdw_find_split_unit.c')
-rw-r--r-- | libdw/libdw_find_split_unit.c | 19 |
1 files changed, 2 insertions, 17 deletions
diff --git a/libdw/libdw_find_split_unit.c b/libdw/libdw_find_split_unit.c index 78c9a2a5..fcfc46e4 100644 --- a/libdw/libdw_find_split_unit.c +++ b/libdw/libdw_find_split_unit.c @@ -84,23 +84,8 @@ __libdw_find_split_unit (Dwarf_CU *cu) if (split->unit_type == DW_UT_split_compile && cu->unit_id8 == split->unit_id8) { - /* Link skeleton and split compule units. */ - cu->split = split; - split->split = cu; - - /* Get .debug_addr and addr_base greedy. - We also need it for the fake addr cu. - There is only one per split debug. */ - Dwarf *dbg = cu->dbg; - Dwarf *sdbg = split->dbg; - if (sdbg->sectiondata[IDX_debug_addr] == NULL - && dbg->sectiondata[IDX_debug_addr] != NULL) - { - sdbg->sectiondata[IDX_debug_addr] - = dbg->sectiondata[IDX_debug_addr]; - split->addr_base = __libdw_cu_addr_base (cu); - sdbg->fake_addr_cu = dbg->fake_addr_cu; - } + /* Link skeleton and split compile units. */ + __libdw_link_skel_split (cu, split); /* We have everything we need from this ELF file. And we are going to close |