From f0457c7c3aba53acb15546996eaf17fc24b94455 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 11 Dec 1998 18:03:41 +0000 Subject: [PATCH] Copied from glibc 2.1. --- elf/sofini.c | 10 ++++++++++ elf/soinit.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/elf/sofini.c b/elf/sofini.c index e44041b5ec..077399f0ce 100644 --- a/elf/sofini.c +++ b/elf/sofini.c @@ -7,3 +7,13 @@ static void (*const __CTOR_END__[1]) (void) static void (*const __DTOR_END__[1]) (void) __attribute__ ((unused, 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. */ + +typedef unsigned int ui32 __attribute__ ((mode (SI))); +static ui32 __FRAME_END__[1] + __attribute__ ((unused, section (".eh_frame"))) + = { 0 }; +#endif diff --git a/elf/soinit.c b/elf/soinit.c index 0310b74b93..1dee73c3be 100644 --- a/elf/soinit.c +++ b/elf/soinit.c @@ -17,6 +17,28 @@ run_hooks (void (*const list[]) (void)) (**list) (); } +#ifdef HAVE_DWARF2_UNWIND_INFO +static char __EH_FRAME_BEGIN__[] + __attribute__ ((section (".eh_frame"))) + = { }; +# ifdef HAVE_DWARF2_UNWIND_INFO_STATIC +/* This must match what's in frame.h in gcc. How can one do that? */ +struct object +{ + void *pc_begin; + void *pc_end; + void *fde_begin; + void *fde_array; + __SIZE_TYPE__ count; + struct object *next; +}; +extern void __register_frame_info (const void *, struct object *); +extern void __deregister_frame_info (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 @@ -24,6 +46,16 @@ __libc_global_ctors (void) { /* Call constructor functions. */ run_hooks (__CTOR_LIST__); +#ifdef HAVE_DWARF2_UNWIND_INFO +# ifdef HAVE_DWARF2_UNWIND_INFO_STATIC + { + static struct object ob; + __register_frame_info (__EH_FRAME_BEGIN__, &ob); + } +# else + __register_frame (__EH_FRAME_BEGIN__); +# endif +#endif } @@ -35,4 +67,11 @@ _fini (void) { /* Call destructor functions. */ run_hooks (__DTOR_LIST__); +#ifdef HAVE_DWARF2_UNWIND_INFO +# ifdef HAVE_DWARF2_UNWIND_INFO_STATIC + __deregister_frame_info (__EH_FRAME_BEGIN__); +# else + __deregister_frame (__EH_FRAME_BEGIN__); +# endif +#endif }