This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: [Patch] Unterminated .eh_frame when using --eh-frame-hdr
Richard Henderson <rth@twiddle.net> writes:
> I mean that all targets that want to use glibc should generate
> the .eh_frame_hdr section. There should be no reason at all to
> support the registry calls.
>
>> You say "why should any port not support .eh_frame_hdr?". I thought the
>> no-.eh_frame_hdr case was there for compatibility with older toolchains.
>> Are you saying that that case is no longer needed, and that we can
>> always assume that the linker supports --eh-frame-hdr?
>
> Yes.
OK, here's a patch to remove the registry calls from soinit.c. The only
other use of HAVE_DWARF2_UNWIND_INFO is to guard the definitions of
__EH_FRAME_BEGIN__ and __EH_FRAME_END__, so the next questions are:
(1) Is it worth keeping the definition of __EH_FRAME_BEGIN__ now that
no code refers to it by name? I decided to in this patch because
I've found it useful for debugging in the past.
(2) Is it worth keeping HAVE_DWARF_UNWIND_INFO just to guard these
definitions? I couldn't see what harm they would do to targets
that don't use .eh_frame, and since the aim is to reduce the
number of configuration variants, it seemed easier to define
them unconditionally.
Patch tested on mips64-linux-gnu. Please install if OK. Let me know
what to change if not ;)
As before, I've included the change to configure in order to help
any potential patch committer.
Richard
2004-11-23 Richard Sandiford <rsandifo@redhat.com>
* configure.in (libc_cv_gcc_dwarf2_unwind_info): Delete.
(HAVE_DWARF2_UNWIND_INFO{,_STATIC}): Remove AC_DEFINEs.
* configure: Regenerate.
* config.h.in (HAVE_DWARF2_UNWIND_INFO{,_STATIC}): Remove undefs.
* elf/soinit.c: Don't include gccframe.h.
(__EH_FRAME_BEGIN__): Define unconditionally.
(__register_frame_info, __deregister_frame_info)
(__register_frame_info_bases, __deregister_frame_info_bases)
(__register_frame, __deregister_frame): Remove declarations.
(__libc_global_ctors, __libc_fini): Don't call registry functions.
* elf/sofini.c (__EH_FRAME_END__): Define unconditionally.
Index: configure.in
===================================================================
RCS file: /cvs/glibc/libc/configure.in,v
retrieving revision 1.430
diff -c -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.430 configure.in
*** configure.in 26 Oct 2004 01:35:54 -0000 1.430
--- configure.in 23 Nov 2004 18:14:58 -0000
*************** if test "$libc_cv_c_asmcr0_bug" != 'no';
*** 1722,1792 ****
fi
fi
- AC_CACHE_CHECK(for DWARF2 unwind info support, libc_cv_gcc_dwarf2_unwind_info,
- [cat > conftest.c <<EOF
- #line $LINENO "configure"
- static char *__EH_FRAME_BEGIN__;
- _start ()
- {
- #ifdef CHECK__register_frame
- __register_frame (__EH_FRAME_BEGIN__);
- __deregister_frame (__EH_FRAME_BEGIN__);
- #endif
- #ifdef CHECK__register_frame_info
- __register_frame_info (__EH_FRAME_BEGIN__);
- __deregister_frame_info (__EH_FRAME_BEGIN__);
- #endif
- }
- int __eh_pc;
- __throw () {}
- /* FIXME: this is fragile. */
- malloc () {}
- strcmp () {}
- strlen () {}
- memcpy () {}
- memset () {}
- free () {}
- abort () {}
- __bzero () {}
- dl_iterate_phdr () {}
- EOF
- libc_unwind_check="${CC-cc} $CFLAGS $CPPFLAGS -DCHECK__register_frame_info \
- $LDFLAGS \
- -nostdlib -nostartfiles -o conftest conftest.c \
- -lgcc"
- # Some platforms' specs put -lgcc first. The second one doesn't hurt.
- if AC_TRY_COMMAND([$libc_unwind_check >&AS_MESSAGE_LOG_FD]) ||
- AC_TRY_COMMAND([$libc_unwind_check -lgcc_eh -lgcc >&AS_MESSAGE_LOG_FD])
- then
- if $libc_unwind_check -v 2>&1 >/dev/null \
- | grep -- --eh-frame-hdr 2>&1 >/dev/null; then
- libc_cv_gcc_dwarf2_unwind_info=no_registry_needed
- else
- libc_cv_gcc_dwarf2_unwind_info=static
- fi
- else
- libc_cv_gcc_dwarf2_unwind_info=no
- fi
- if test $libc_cv_gcc_dwarf2_unwind_info = no; then
- if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -DCHECK__register_frame
- $LDFLAGS -nostdlib -nostartfiles
- -o conftest conftest.c -lgcc >&AS_MESSAGE_LOG_FD]); then
- libc_cv_gcc_dwarf2_unwind_info=yes
- else
- libc_cv_gcc_dwarf2_unwind_info=no
- fi
- fi
- rm -f conftest*])
- case $libc_cv_gcc_dwarf2_unwind_info in
- yes)
- AC_DEFINE(HAVE_DWARF2_UNWIND_INFO)
- ;;
- static)
- AC_DEFINE(HAVE_DWARF2_UNWIND_INFO)
- AC_DEFINE(HAVE_DWARF2_UNWIND_INFO_STATIC)
- ;;
- esac
-
dnl Check whether compiler understands __builtin_expect.
AC_CACHE_CHECK(for __builtin_expect, libc_cv_gcc_builtin_expect,
[cat > conftest.c <<EOF
--- 1722,1727 ----
Index: configure
===================================================================
RCS file: /cvs/glibc/libc/configure,v
retrieving revision 1.423
diff -c -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.423 configure
*** configure 26 Oct 2004 01:35:53 -0000 1.423
--- configure 23 Nov 2004 18:14:58 -0000
*************** _ACEOF
*** 6300,6401 ****
fi
fi
- echo "$as_me:$LINENO: checking for DWARF2 unwind info support" >&5
- echo $ECHO_N "checking for DWARF2 unwind info support... $ECHO_C" >&6
- if test "${libc_cv_gcc_dwarf2_unwind_info+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
- else
- cat > conftest.c <<EOF
- #line $LINENO "configure"
- static char *__EH_FRAME_BEGIN__;
- _start ()
- {
- #ifdef CHECK__register_frame
- __register_frame (__EH_FRAME_BEGIN__);
- __deregister_frame (__EH_FRAME_BEGIN__);
- #endif
- #ifdef CHECK__register_frame_info
- __register_frame_info (__EH_FRAME_BEGIN__);
- __deregister_frame_info (__EH_FRAME_BEGIN__);
- #endif
- }
- int __eh_pc;
- __throw () {}
- /* FIXME: this is fragile. */
- malloc () {}
- strcmp () {}
- strlen () {}
- memcpy () {}
- memset () {}
- free () {}
- abort () {}
- __bzero () {}
- dl_iterate_phdr () {}
- EOF
- libc_unwind_check="${CC-cc} $CFLAGS $CPPFLAGS -DCHECK__register_frame_info \
- $LDFLAGS \
- -nostdlib -nostartfiles -o conftest conftest.c \
- -lgcc"
- # Some platforms' specs put -lgcc first. The second one doesn't hurt.
- if { ac_try='$libc_unwind_check >&5'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; } ||
- { ac_try='$libc_unwind_check -lgcc_eh -lgcc >&5'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }
- then
- if $libc_unwind_check -v 2>&1 >/dev/null \
- | grep -- --eh-frame-hdr 2>&1 >/dev/null; then
- libc_cv_gcc_dwarf2_unwind_info=no_registry_needed
- else
- libc_cv_gcc_dwarf2_unwind_info=static
- fi
- else
- libc_cv_gcc_dwarf2_unwind_info=no
- fi
- if test $libc_cv_gcc_dwarf2_unwind_info = no; then
- if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -DCHECK__register_frame
- $LDFLAGS -nostdlib -nostartfiles
- -o conftest conftest.c -lgcc >&5'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- libc_cv_gcc_dwarf2_unwind_info=yes
- else
- libc_cv_gcc_dwarf2_unwind_info=no
- fi
- fi
- rm -f conftest*
- fi
- echo "$as_me:$LINENO: result: $libc_cv_gcc_dwarf2_unwind_info" >&5
- echo "${ECHO_T}$libc_cv_gcc_dwarf2_unwind_info" >&6
- case $libc_cv_gcc_dwarf2_unwind_info in
- yes)
- cat >>confdefs.h <<\_ACEOF
- #define HAVE_DWARF2_UNWIND_INFO 1
- _ACEOF
-
- ;;
- static)
- cat >>confdefs.h <<\_ACEOF
- #define HAVE_DWARF2_UNWIND_INFO 1
- _ACEOF
-
- cat >>confdefs.h <<\_ACEOF
- #define HAVE_DWARF2_UNWIND_INFO_STATIC 1
- _ACEOF
-
- ;;
- esac
-
echo "$as_me:$LINENO: checking for __builtin_expect" >&5
echo $ECHO_N "checking for __builtin_expect... $ECHO_C" >&6
if test "${libc_cv_gcc_builtin_expect+set}" = set; then
--- 6300,6305 ----
Index: config.h.in
===================================================================
RCS file: /cvs/glibc/libc/config.h.in,v
retrieving revision 1.70
diff -c -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.70 config.h.in
*** config.h.in 16 Sep 2004 23:55:55 -0000 1.70
--- config.h.in 23 Nov 2004 18:14:58 -0000
***************
*** 94,106 ****
/* Define if static NSS modules are wanted. */
#undef DO_STATIC_NSS
- /* Define if gcc uses DWARF2 unwind information for exception support. */
- #undef HAVE_DWARF2_UNWIND_INFO
-
- /* Define if gcc uses DWARF2 unwind information for exception support
- with static variable. */
- #undef HAVE_DWARF2_UNWIND_INFO_STATIC
-
/* Define if the compiler supports __builtin_expect. */
#undef HAVE_BUILTIN_EXPECT
--- 94,99 ----
Index: elf/soinit.c
===================================================================
RCS file: /cvs/glibc/libc/elf/soinit.c,v
retrieving revision 1.11
diff -c -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.11 soinit.c
*** elf/soinit.c 26 Nov 2003 07:14:31 -0000 1.11
--- elf/soinit.c 23 Nov 2004 18:14:58 -0000
***************
*** 6,15 ****
#include <libc-internal.h>
#include <stdlib.h>
- #ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
- # include <gccframe.h>
- #endif
-
static void (*const __CTOR_LIST__[1]) (void)
__attribute__ ((section (".ctors")))
= { (void (*) (void)) -1 };
--- 6,11 ----
*************** run_hooks (void (*const list[]) (void))
*** 24,44 ****
(**list) ();
}
- #ifdef HAVE_DWARF2_UNWIND_INFO
static char __EH_FRAME_BEGIN__[]
__attribute__ ((section (".eh_frame")))
= { };
- # ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
- extern void __register_frame_info (const void *, struct object *);
- extern void __register_frame_info_bases (const void *, struct object *,
- void *, void *);
- extern void __deregister_frame_info (const void *);
- extern void __deregister_frame_info_bases (const void *);
- # else
- extern void __register_frame (const void *);
- extern void __deregister_frame (const void *);
- # endif
- #endif
/* This function will be called from _init in init-first.c. */
void
--- 20,28 ----
*************** __libc_global_ctors (void)
*** 46,78 ****
{
/* Call constructor functions. */
run_hooks (__CTOR_LIST__);
-
- #ifdef HAVE_DWARF2_UNWIND_INFO
- # ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
- {
- static struct object ob;
- # if defined CRT_GET_RFIB_TEXT || defined CRT_GET_RFIB_DATA
- void *tbase, *dbase;
-
- # ifdef CRT_GET_RFIB_TEXT
- CRT_GET_RFIB_TEXT (tbase);
- # else
- tbase = NULL;
- # endif
- # ifdef CRT_GET_RFIB_DATA
- CRT_GET_RFIB_DATA (dbase);
- # else
- dbase = NULL;
- # endif
- __register_frame_info_bases (__EH_FRAME_BEGIN__, &ob, tbase, dbase);
- # else
- __register_frame_info (__EH_FRAME_BEGIN__, &ob);
- # endif
- }
- # else
- __register_frame (__EH_FRAME_BEGIN__);
- # endif
- #endif
}
--- 30,35 ----
*************** __libc_fini (void)
*** 89,105 ****
{
/* Call destructor functions. */
run_hooks (__DTOR_LIST__);
- #ifdef HAVE_DWARF2_UNWIND_INFO
- # ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
- # if defined CRT_GET_RFIB_TEXT || defined CRT_GET_RFIB_DATA
- __deregister_frame_info_bases (__EH_FRAME_BEGIN__);
- # else
- __deregister_frame_info (__EH_FRAME_BEGIN__);
- # endif
- # else
- __deregister_frame (__EH_FRAME_BEGIN__);
- # endif
- #endif
}
#ifdef HAVE_INITFINI_ARRAY
void (*_fini_ptr) (void) __attribute__ ((section (".fini_array")))
--- 46,51 ----
Index: elf/sofini.c
===================================================================
RCS file: /cvs/glibc/libc/elf/sofini.c,v
retrieving revision 1.4
diff -c -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.4 sofini.c
*** elf/sofini.c 22 Jul 2003 19:37:27 -0000 1.4
--- elf/sofini.c 23 Nov 2004 18:14:58 -0000
*************** static void (*const __DTOR_END__[1]) (vo
*** 8,14 ****
__attribute__ ((used, section (".dtors")))
= { 0 };
- #ifdef HAVE_DWARF2_UNWIND_INFO
/* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
this would be the 'length' field in a real FDE. */
--- 8,13 ----
*************** typedef unsigned int ui32 __attribute__
*** 16,19 ****
static ui32 __FRAME_END__[1]
__attribute__ ((used, section (".eh_frame")))
= { 0 };
- #endif
--- 15,17 ----