diff options
author | Sandra Loosemore <sandra@codesourcery.com> | 2020-01-31 16:46:50 -0800 |
---|---|---|
committer | Sandra Loosemore <sandra@codesourcery.com> | 2020-01-31 16:46:50 -0800 |
commit | 2d33dcfe9f0494c9b56a8d704c3d27c5a4329ebc (patch) | |
tree | f552c2ff1a82a7100904140e5c4f9f20085aee0e /libgcc | |
parent | 20fa702b32c7ec7a7215df322d3e8d19b79f2068 (diff) | |
download | gcc-2d33dcfe9f0494c9b56a8d704c3d27c5a4329ebc.zip gcc-2d33dcfe9f0494c9b56a8d704c3d27c5a4329ebc.tar.gz gcc-2d33dcfe9f0494c9b56a8d704c3d27c5a4329ebc.tar.bz2 |
nios2: Support for GOT-relative DW_EH_PE_datarel encoding.
On nios2-linux-gnu, there has been a long-standing bug in C++ exception
handling that sometimes resulted in link errors like
../nios2-linux-gnu/bin/ld: FDE encoding in /tmp/cccfpQ2l.o(.eh_frame) prevents .eh_frame_hdr table being created
when building some shared libraries or PIE executables. The root of
the problem is that GCC was incorrectly emitting an absolute encoding
in EH tables for PIC. This patch changes it to use either
DW_EH_PE_indirect (for global) or DW_EH_PE_datarel (for local), and
fixes libgcc so it can find the address of the GOT as the base address
for DW_EH_PE_datarel.
Complicating matters somewhat, GAS was missing support for
%gotoff(symbol) relocation syntax. I have just pushed a fix for that,
but I've added a configure check to test for presence of the binutils
support and fall back to the current absolute encoding (which works
most of the time) if it is not available. Once the fix makes it into
an official binutils release it might be appropriate to make this
error out instead.
Since this is a wrong-code bug and affects only nios2 target, I think
this is appropriate for Stage 4. I regression-tested on both
nios2-linux-gnu and nios2-elf, with and without the binutils support
present, before committing this.
2020-01-31 Sandra Loosemore <sandra@codesourcery.com>
gcc/
* configure.ac [nios2-*-*]: Check HAVE_AS_NIOS2_GOTOFF_RELOCATION.
* config.in: Regenerated.
* configure: Regenerated.
* config/nios2/nios2.h (ASM_PREFERRED_EH_DATA_FORMAT): Fix handling
for PIC when HAVE_AS_NIOS2_GOTOFF_RELOCATION.
(ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX): New.
gcc/testsuite/
* g++.target/nios2/hello-pie.C: New.
* g++.target/nios2/nios2.exp: New.
libgcc/
* config.host [nios2-*-linux*] (tmake_file, tm_file): Adjust.
* config/nios2-elf-lib.h: New.
* unwind-dw2-fde-dip.c (_Unwind_IteratePhdrCallback): Use existing
code for finding GOT base for nios2.
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 9 | ||||
-rw-r--r-- | libgcc/config.host | 3 | ||||
-rw-r--r-- | libgcc/config/nios2/elf-lib.h | 24 | ||||
-rw-r--r-- | libgcc/unwind-dw2-fde-dip.c | 2 |
4 files changed, 36 insertions, 2 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 20cb222..9ec9edf 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,12 @@ +2020-01-31 Sandra Loosemore <sandra@codesourcery.com> + + nios2: Support for GOT-relative DW_EH_PE_datarel encoding. + + * config.host [nios2-*-linux*] (tmake_file, tm_file): Adjust. + * config/nios2-elf-lib.h: New. + * unwind-dw2-fde-dip.c (_Unwind_IteratePhdrCallback): Use existing + code for finding GOT base for nios2. + 2020-01-27 Martin Liska <mliska@suse.cz> PR gcov-profile/93403 diff --git a/libgcc/config.host b/libgcc/config.host index 8f0ea90..4198dc8 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -1112,7 +1112,8 @@ nds32*-elf*) esac ;; nios2-*-linux*) - tmake_file="$tmake_file nios2/t-nios2 nios2/t-linux t-libgcc-pic t-slibgcc-libgcc" + tmake_file="$tmake_file nios2/t-nios2 nios2/t-linux t-libgcc-pic t-eh-dw2-dip t-slibgcc-libgcc" + tm_file="$tm_file nios2/elf-lib.h" md_unwind_header=nios2/linux-unwind.h ;; nios2-*-*) diff --git a/libgcc/config/nios2/elf-lib.h b/libgcc/config/nios2/elf-lib.h new file mode 100644 index 0000000..4d718d9 --- /dev/null +++ b/libgcc/config/nios2/elf-lib.h @@ -0,0 +1,24 @@ +/* Target macros for the Nios II port of GCC. + Copyright (C) 2015-2020 Free Software Foundation, Inc. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +<http://www.gnu.org/licenses/>. */ + +#define CRT_GET_RFIB_DATA(dbase) \ + ({ extern void *_gp_got; (dbase) = &_gp_got; }) diff --git a/libgcc/unwind-dw2-fde-dip.c b/libgcc/unwind-dw2-fde-dip.c index d3a09ce..6e50405 100644 --- a/libgcc/unwind-dw2-fde-dip.c +++ b/libgcc/unwind-dw2-fde-dip.c @@ -329,7 +329,7 @@ _Unwind_IteratePhdrCallback (struct dl_phdr_info *info, size_t size, void *ptr) return 1; #ifdef CRT_GET_RFIB_DATA -# ifdef __i386__ +# if defined __i386__ || defined __nios2__ data->dbase = NULL; if (p_dynamic) { |