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