diff mbox series

[nios2,committed] Disable --eh-frame-hdr with -pie or -shared on nios2-linux-gnu

Message ID b652a8a6-dcad-bbe6-4ec8-bc0cb3d71d45@codesourcery.com
State New
Headers show
Series [nios2,committed] Disable --eh-frame-hdr with -pie or -shared on nios2-linux-gnu | expand

Commit Message

Sandra Loosemore Dec. 5, 2019, 9:47 p.m. UTC
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

Comments

Sandra Loosemore Dec. 8, 2019, 5:30 p.m. UTC | #1
On 12/5/19 2:47 PM, Sandra Loosemore wrote:
> 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

I've reverted this patch, as it appears I accidentally tested a 
different version of it (that disabled the option for -pie only and not 
-shared) than I committed, and the one committed triggers other errors. 
I need to revisit my original analysis of the linker bug and figure out 
why it is being triggered for -shared too.  And there's probably another 
bug lurking somewhere that's causing the execution errors in shared 
libraries linked without --eh-frame-hdr.  Needs More Thought.

BTW, the test case for -shared is the C++ version of the program used to 
test for { dg-require-effective-target shared } support.  :-(  (But 
libstdc++ builds fine as a shared library and doesn't fall over during 
testing....)

-Sandra
diff mbox series

Patch

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