aboutsummaryrefslogtreecommitdiff
path: root/elf/soinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/soinit.c')
-rw-r--r--elf/soinit.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/elf/soinit.c b/elf/soinit.c
index ff65af4a36..32ed4454b5 100644
--- a/elf/soinit.c
+++ b/elf/soinit.c
@@ -4,6 +4,7 @@
calling those lists of functions. */
#include <libc-internal.h>
+#include <stdlib.h>
#ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
# include <gccframe.h>
@@ -29,7 +30,10 @@ static char __EH_FRAME_BEGIN__[]
= { };
# 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 *);
@@ -47,7 +51,23 @@ __libc_global_ctors (void)
# 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__);
@@ -66,7 +86,11 @@ _fini (void)
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