mirror of
git://sourceware.org/git/glibc.git
synced 2025-04-06 14:10:30 +08:00
Copied from glibc 2.1.
This commit is contained in:
parent
ed0d07bde9
commit
f0457c7c3a
10
elf/sofini.c
10
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
|
||||
|
39
elf/soinit.c
39
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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user