I've checked in this patch to fix a long-standing bug on nios2-linux-gnu
that resulted in linker errors like
../nios2-linux-gnu/bin/ld: FDE encoding in /tmp/cccfpQ2l.o(.eh_frame)
prevents .eh_frame_hdr table being created
when linking with -pie or -shared. The nios2 ABI doesn't provide the
relocations needed for those situations, so we shouldn't be passing
--eh-frame-hdr to the linker.
I've also checked in a related patch to the linker: it was emitting
these diagnostics unconditionally, even when --eh-frame-hdr was not
enabled. See
https://sourceware.org/ml/binutils/2019-12/msg00013.html
-Sandra
2019-12-05 Sandra Loosemore <san...@codesourcery.com>
Disable --eh-frame-hdr with -pie or -shared on nios2-linux-gnu.
The nios2 ABI doesn't have appropriate relocations to support
--eh-frame-hdr with -pie or -shared, so we need to override the
default specs that add that link option. Otherwise we get linker
warnings about invalid FDE encodings.
gcc/
* config/nios2/linux.h (LINK_EH_SPEC): Define.
gcc/testsuite/
* g++.target/nios2/hello-pie.C: New.
* g++.target/nios2/nios2.exp: New.
Index: gcc/config/nios2/linux.h
===================================================================
--- gcc/config/nios2/linux.h (revision 279021)
+++ gcc/config/nios2/linux.h (working copy)
@@ -40,6 +40,12 @@
-dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \
%{static:-static}}"
+/* The nios2 ABI does not have appropriate relocations to support
+ --eh-frame-hdr with PIE, or in shared libraries. */
+#undef LINK_EH_SPEC
+#define LINK_EH_SPEC \
+ "%{!pie: %{!shared: %{!static:--eh-frame-hdr}}} "
+
/* This toolchain implements the ABI for Linux Systems documented in the
Nios II Processor Reference Handbook. */
#define TARGET_LINUX_ABI 1
Index: gcc/testsuite/g++.target/nios2/hello-pie.C
===================================================================
--- gcc/testsuite/g++.target/nios2/hello-pie.C (nonexistent)
+++ gcc/testsuite/g++.target/nios2/hello-pie.C (working copy)
@@ -0,0 +1,14 @@
+// { dg-do run { target *-*-linux* } }
+// { dg-options "-pie -fpie" }
+// { dg-output "Hello, pie World" }
+
+// This test used to give an "FDE encoding" error from the linker due to
+// the ABI not having appropriate relocations for PIE.
+
+#include <iostream>
+
+int
+main ()
+{
+ std::cout << "Hello, pie World" << std::endl;
+}
Index: gcc/testsuite/g++.target/nios2/nios2.exp
===================================================================
--- gcc/testsuite/g++.target/nios2/nios2.exp (nonexistent)
+++ gcc/testsuite/g++.target/nios2/nios2.exp (working copy)
@@ -0,0 +1,34 @@
+# Copyright (C) 2019 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Exit immediately if this isn't a nios2 target.
+if ![istarget nios2*-*-*] then {
+ return
+}
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" ""
+
+# All done.
+dg-finish