Copied from glibc 2.1.

This commit is contained in:
Ulrich Drepper 1998-12-11 18:03:41 +00:00
parent ed0d07bde9
commit f0457c7c3a
2 changed files with 49 additions and 0 deletions

View File

@ -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

View File

@ -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
}