summaryrefslogtreecommitdiff
path: root/ldso
diff options
context:
space:
mode:
Diffstat (limited to 'ldso')
-rw-r--r--ldso/ldso/Makefile4
-rw-r--r--ldso/ldso/ldso.c10
2 files changed, 14 insertions, 0 deletions
diff --git a/ldso/ldso/Makefile b/ldso/ldso/Makefile
index e18b292f6..f2707d820 100644
--- a/ldso/ldso/Makefile
+++ b/ldso/ldso/Makefile
@@ -28,6 +28,10 @@ ASFLAGS+=$(call check_as,--noexecstack)
endif
XXFLAGS=$(XWARNINGS) $(SSP_DISABLE_FLAGS)
+ifeq ($(DL_FINI_CRT_COMPAT),y)
+XXFLAGS+=-D_DL_FINI_CRT_COMPAT
+endif
+
ifeq ($(DODEBUG),y)
# Not really much point in including debugging info, since gdb
# can't really debug ldso, since gdb requires help from ldso to
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
index c60815aff..c0f685802 100644
--- a/ldso/ldso/ldso.c
+++ b/ldso/ldso/ldso.c
@@ -806,6 +806,16 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr,
(*dl_elf_func) ();
}
}
+#ifdef _DL_FINI_CRT_COMPAT
+ /* arches that have moved their ldso FINI handling should skip this part */
+ {
+ int (*_dl_atexit) (void *) = (int (*)(void *)) (intptr_t) _dl_find_hash("atexit",
+ _dl_symbol_tables, NULL, ELF_RTYPE_CLASS_PLT);
+
+ if (_dl_atexit)
+ (*_dl_atexit) (_dl_fini);
+ }
+#endif
/* Find the real malloc function and make ldso functions use that from now on */
_dl_malloc_function = (void* (*)(size_t)) (intptr_t) _dl_find_hash("malloc",