Duplicate .debug_lines (Was: [PATCH 5/5] Add --gdwarf-5 to ASM_SPEC)

H.J. Lu hjl.tools@gmail.com
Wed Aug 26 23:38:21 GMT 2020


On Wed, Aug 26, 2020 at 2:38 PM Mark Wielaard <mark@klomp.org> wrote:
>
> Hi gcc hackers, binutils hackers,
>
> Nick, Jakub and I were discussing the gcc patch below and all the ways
> it is wrong. Most things can be fixed in the spec. Like only passing
> -gdwarf if we are generating DWARF and passing the right DWARF version
> as -gdwarf-N for the version that gcc itself creates. But whether or
> not we want gas to generate .debug_line info is a bit tricky. But when
> giving -gdwarf-N gas will always try to generate a .debug_line section
> and error out when there is already one.
>
> Would it be possible to have something like the following in gas, so
> that it doesn't try generating a .debug_line section if there already
> is one, even when -gdwarf-N is given (unless the assembly also
> contains .loc directives because that shows the user is really
> confused)?
>
> diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
> index e4ba56d82ba..c0c09f4e9d0 100644
> --- a/gas/dwarf2dbg.c
> +++ b/gas/dwarf2dbg.c
> @@ -2626,7 +2626,7 @@ dwarf2_init (void)
>
>
>  /* Finish the dwarf2 debug sections.  We emit .debug.line if there
> -   were any .file/.loc directives, or --gdwarf2 was given, or if the
> +   were any .file/.loc directives, or --gdwarf2 was given, and if the
>     file has a non-empty .debug_info section and an empty .debug_line
>     section.  If we emit .debug_line, and the .debug_info section is
>     empty, we also emit .debug_info, .debug_aranges and .debug_abbrev.
> @@ -2650,9 +2650,16 @@ dwarf2_finish (void)
>    empty_debug_line = line_seg == NULL || !seg_not_empty_p (line_seg);
>
>    /* We can't construct a new debug_line section if we already have one.
> -     Give an error.  */
> +     Give an error if we have seen any .loc, otherwise trust the user
> +     knows what they are doing and want to generate the .debug_line
> +     (and all other debug sections) themselves.  */
>    if (all_segs && !empty_debug_line)
> -    as_fatal ("duplicate .debug_line sections");
> +    {
> +      if (dwarf2_loc_directive_seen)
> +       as_fatal ("duplicate .debug_line sections");
> +      else
> +       return;
> +    }
>
>    if ((!all_segs && emit_other_sections)
>        || (!emit_other_sections && !empty_debug_line))
>

I have run into this issue before.  "as -g" shouldn't silently
generate incorrect
debug info when input assembly codes already contain debug directives.
AS should either issue an error or ignore -g.  In either case, we need
a testcase
to verify it.

-- 
H.J.


More information about the Binutils mailing list