Commit: Fix readelf/objdump's handling of DW_FORM_ref_addr

H.J. Lu hjl.tools@gmail.com
Thu Oct 29 12:19:00 GMT 2020


On Tue, Oct 27, 2020 at 9:17 AM Nick Clifton via Binutils
<binutils@sourceware.org> wrote:
>
> Hi Guys,
>
>   My previous patch to workaround the problems handling DW_FORM_ref_addr
>   forms in DWARF debug information has proven to be insufficient.  There
>   are still cases where the form is decoded improperly, causing
>   non-LEB128 data to be read as if it were an LEB128 value.
>
>   So I am applying the attached patch to fix the problem properly by
>   actually decoding the form correctly.  The issue with this form is
>   that it points to an arbitrary location within the .debug_info
>   section, and in order to decode it, it is necessary to have the
>   abbreviations associated with whichever CU is associated with the
>   referenced location.  All of which means that it is necessary to parse
>   all of the abbreviations and all of the CU headers before attempting
>   to actually parse the contents of any CU.
>
>   I have gone for simplicity in the algorithms that I have used.  Which
>   probably means that they will be slower than they could be.  But that
>   can always be fixed by a future patch.
>
>   Tested with a wide variety of different toolchains.
>
> Cheers
>   Nick
>
> binutils/ChangeLog
> 2020-10-27  Nick Clifton  <nickc@redhat.com>
>
>         * dwarf.c (struct abbrev_list): New structure.  Used to collect
>         lists of abbreviation sets.
>         (struct abbrev_map): New structure.  Used to map CU offsets to
>         abbreviation offsets.
>         (record_abbrev_list): New function.  A new entry to an
>         abbreviation list.
>         (free_all_abbrevs): Update to free abbreviation lists.
>         (new_abbrev_list): New function.  Start a new abbreviation
>         list.
>         (find_abbrev_list_by_abbrev_offset): New function.
>         (find_abbrev_map_by_offset): New function.
>         (add_abbrev): Add abbrev_list parameter.
>         (add_abbrev_attr): Likewise.
>         (process_abbrev_section): Rename to process_abbrev_set and add
>         list parameter.
>         (get_type_abbrev_from_form): New function.  Attempts to decode the
>         forms used by DW_AT_type attributes.
>         (get_type_signedness): Display type names if operating in wide
>         mode.  Use get_type_abbrev_from_form.
>         (read_and_display_attr_value): Use get_type_abbrev_from_form.
>         (process_debug_info): Pre-parse the CU headers to collate all the
>         abbrevs before starting the main scan.
>         (process_debug_abbrev): Do not free any loaded abbrevs.
>         (free_debug_memory): Free the abbrev maps.
>

This caused:

https://sourceware.org/bugzilla/show_bug.cgi?id=26808

Is there a testcase to verify that this patch fixes a real bug?

-- 
H.J.


More information about the Binutils mailing list