This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Detect problematic linker for HAVE_LD_EH_GC_SECTIONS
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 21 Dec 2006 23:12:47 +0100
- Subject: Detect problematic linker for HAVE_LD_EH_GC_SECTIONS
The patch
2006-10-28 Eric Botcazou <ebotcazou@adacore.com>
* except.h (output_function_exception_table): Add 'const char*' param.
* except.c (switch_to_exception_section): Add 'const char*' param.
If named sections are supported and HAVE_LD_EH_GC_SECTIONS is defined
and flag_function_sections is set, use a function-specific section.
(output_function_exception_table): Add 'const char*' param.
Adjust call to switch_to_exception_section.
* final.c (rest_of_handle_final): Adjust calls to
output_function_exception_table.
* configure.ac (HAVE_LD_EH_GC_SECTIONS): New check.
* config.in: Regenerate.
* configure: Likewise.
works in conjunction with a recent GNU linker (2.17) to improve --gc-sections
for languages using EH. As discovered by early FC6 users, there is a problem
if COMDAT groups are disabled. The linker fix has been in for a few days:
http://sourceware.org/ml/binutils/2006-12/msg00112.html
and the attached patch simply disables compiler support with a buggy linker.
According to Dave Anglin, the feature runs into another binutils bug on
HP-PA/Linux so the patch additionally disables it on this platform.
Bootstrapped/regtested on i586-suse-linux, tested with buggy and non-buggy
linker, with and without COMDAT groups, applied to mainline as obvious.
2006-12-21 Eric Botcazou <ebotcazou@adacore.com>
PR other/29639
* configure.ac (HAVE_LD_EH_GC_SECTIONS): Check that exception tables
are kept for .gnu.linkonce.t sections if COMDAT groups are disabled.
* configure: Regenerate.
--
Eric Botcazou
Index: configure.ac
===================================================================
--- configure.ac (revision 120045)
+++ configure.ac (working copy)
@@ -3192,10 +3192,46 @@ EOF
gcc_cv_ld_eh_gc_sections=no
elif $gcc_cv_objdump -h conftest | grep gcc_except_table > /dev/null; then
gcc_cv_ld_eh_gc_sections=yes
+ # If no COMDAT groups, the compiler will emit .gnu.linkonce.t. sections.
+ if test x$gcc_cv_as_comdat_group != xyes; then
+ gcc_cv_ld_eh_gc_sections=no
+ cat > conftest.s <<EOF
+ .section .text
+.globl _start
+ .type _start, @function
+_start:
+ .long foo
+ .size _start, .-_start
+ .section .gnu.linkonce.t.foo,"ax",@progbits
+ .type foo, @function
+foo:
+ .long 0
+ .size foo, .-foo
+ .section .gcc_except_table.foo,"a",@progbits
+.L0:
+ .long 0
+ .section .eh_frame,"a",@progbits
+ .long .L0
+EOF
+ if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
+ if $gcc_cv_ld -o conftest conftest.o --entry=_start --gc-sections 2>&1 \
+ | grep "gc-sections option ignored" > /dev/null; then
+ gcc_cv_ld_eh_gc_sections=no
+ elif $gcc_cv_objdump -h conftest | grep gcc_except_table > /dev/null; then
+ gcc_cv_ld_eh_gc_sections=yes
+ fi
+ fi
+ fi
fi
fi
rm -f conftest.s conftest.o conftest
fi
+case "$target" in
+ hppa*-*-linux*)
+ # ??? This apparently exposes a binutils bug with PC-relative relocations.
+ gcc_cv_ld_eh_gc_sections=no
+ ;;
+esac
if test x$gcc_cv_ld_eh_gc_sections = xyes; then
AC_DEFINE(HAVE_LD_EH_GC_SECTIONS, 1,
[Define if your linker supports garbage collection of