[PATCH 8/9] gas: Check for overflow on return column in version 1 CIE DWARF

Andrew Burgess andrew.burgess@embecosm.com
Fri Nov 22 22:51:00 GMT 2019


* Palmer Dabbelt <palmerdabbelt@google.com> [2019-11-22 14:33:03 -0800]:

> On Fri, 22 Nov 2019 04:10:32 PST (-0800), andrew.burgess@embecosm.com wrote:
> > In version 1 of DWARF CIE format, the return register column is just a
> > single byte.  For targets with large numbers of DWARF registers, any
> > use of a register with a high number for the return column
> > will (currently) silently overflow giving incorrect DWARF.
> >
> > This commit adds an error when the overflow occurs.
> >
> > gas/ChangeLog:
> >
> > 	* dw2gencfi.c (output_cie): Error on return column overflow.
> > 	* testsuite/gas/riscv/cie-rtn-col-1.d: New file.
> > 	* testsuite/gas/riscv/cie-rtn-col-3.d: New file.
> > 	* testsuite/gas/riscv/cie-rtn-col.s: New file.
> >
> > Change-Id: I1809f739ba7771737ec012807f0260e1a3ed5e64
> > ---
> >  gas/ChangeLog                           |  7 +++++++
> >  gas/dw2gencfi.c                         |  7 ++++++-
> >  gas/testsuite/gas/riscv/cie-rtn-col-1.d |  3 +++
> >  gas/testsuite/gas/riscv/cie-rtn-col-3.d | 17 +++++++++++++++++
> >  gas/testsuite/gas/riscv/cie-rtn-col.s   |  3 +++
> >  5 files changed, 36 insertions(+), 1 deletion(-)
> >  create mode 100644 gas/testsuite/gas/riscv/cie-rtn-col-1.d
> >  create mode 100644 gas/testsuite/gas/riscv/cie-rtn-col-3.d
> >  create mode 100644 gas/testsuite/gas/riscv/cie-rtn-col.s
> >
> > diff --git a/gas/dw2gencfi.c b/gas/dw2gencfi.c
> > index e27253db8ee..4c19987dfcf 100644
> > --- a/gas/dw2gencfi.c
> > +++ b/gas/dw2gencfi.c
> > @@ -1887,7 +1887,12 @@ output_cie (struct cie_entry *cie, bfd_boolean eh_frame, int align)
> >    out_uleb128 (DWARF2_LINE_MIN_INSN_LENGTH);	/* Code alignment.  */
> >    out_sleb128 (DWARF2_CIE_DATA_ALIGNMENT);	/* Data alignment.  */
> >    if (flag_dwarf_cie_version == 1)		/* Return column.  */
> > -    out_one (cie->return_column);
> > +    {
> > +      if ((cie->return_column & 0xff) != cie->return_column)
> > +        as_bad (_("return column number %d overflows in CIE version 1"),
> > +                cie->return_column);
> > +      out_one (cie->return_column);
> > +    }
> >    else
> >      out_uleb128 (cie->return_column);
> >    if (eh_frame)
> > diff --git a/gas/testsuite/gas/riscv/cie-rtn-col-1.d b/gas/testsuite/gas/riscv/cie-rtn-col-1.d
> > new file mode 100644
> > index 00000000000..dba9c0d3811
> > --- /dev/null
> > +++ b/gas/testsuite/gas/riscv/cie-rtn-col-1.d
> > @@ -0,0 +1,3 @@
> > +#as: --gdwarf-cie-version=1
> > +#source: cie-rtn-col.s
> > +#error: return column number 4929 overflows in CIE version 1
> > diff --git a/gas/testsuite/gas/riscv/cie-rtn-col-3.d b/gas/testsuite/gas/riscv/cie-rtn-col-3.d
> > new file mode 100644
> > index 00000000000..a1d71e1a940
> > --- /dev/null
> > +++ b/gas/testsuite/gas/riscv/cie-rtn-col-3.d
> > @@ -0,0 +1,17 @@
> > +#objdump: --dwarf=frames
> > +#as: --gdwarf-cie-version=3
> > +#source: cie-rtn-col.s
> > +
> > +.*:     file format elf.*-.*riscv
> > +
> > +Contents of the .* section:
> > +
> > +
> > +00000000 [a-zA-Z0-9]+ [a-zA-Z0-9]+ CIE
> > +  Version:               3
> > +  Augmentation:          .*
> > +  Code alignment factor: .*
> > +  Data alignment factor: .*
> > +  Return address column: 4929
> > +  Augmentation data:     .*
> > +#...
> > diff --git a/gas/testsuite/gas/riscv/cie-rtn-col.s b/gas/testsuite/gas/riscv/cie-rtn-col.s
> > new file mode 100644
> > index 00000000000..ca8774f1bcc
> > --- /dev/null
> > +++ b/gas/testsuite/gas/riscv/cie-rtn-col.s
> > @@ -0,0 +1,3 @@
> > +        .cfi_startproc
> > +        .cfi_return_column mepc
> > +        .cfi_endproc
> 
> Have you tried backtracing through a trap handler?  I guess in theory that
> would work, assuming everything was sufficiently decorated and the whole system
> was a single ELF.

Absolutely! I have that working locally but using a slightly modified
GDB.  Once these patches land in binutils I'm going to take a look to
see what GDB might still be outstanding to support this - but it
shouldn't be much, if anything.

Thanks,
Andrew

> 
> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>



More information about the Binutils mailing list