[git commit] libdl: add option for controlling dl_cleanup
Carmelo Amoroso
carmelo.amoroso at st.com
Mon Jul 25 07:09:03 UTC 2011
commit: http://git.uclibc.org/uClibc/commit/?id=3d5cec4ff704c2dec151f3cdbcc426d746d37fcc
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/master
When debugging memory leaks with Valgrind, it is required that
dynamically loaded shared objects are not unloaded when a process exits,
otherwise symbols from those files aren't correctly resolved in
allocation traces. This patch adds the LDSO_NO_CLEANUP configuration
option to control this behaviour.
Signed-off-by: Richard Braun <rbraun at sceen.net>
Signed-off-by: Carmelo Amoroso <carmelo.amoroso at st.com>
---
extra/Configs/Config.in | 12 ++++++++++++
ldso/libdl/Makefile.in | 6 +++++-
ldso/libdl/libdl.c | 2 ++
3 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in
index 2fa0b07..af4c038 100644
--- a/extra/Configs/Config.in
+++ b/extra/Configs/Config.in
@@ -417,6 +417,18 @@ config LDSO_SEARCH_INTERP_PATH
If unsure, simply say Y here.
+config LDSO_NO_CLEANUP
+ bool "Disable automatic unloading of dynamically loaded shared objects"
+ depends on HAVE_SHARED
+ default n
+ help
+ If you need complete allocation traces when debugging memory leaks
+ using Valgrind in a process that dynamically loads shared objects,
+ then answer Y here. Unlike glibc, uClibc unloads all dynamically
+ loaded shared objects when a process exits, which prevents Valgrind
+ from correctly resolving the symbols from the unloaded shared objects.
+ Unless you know you need this, you should answer N.
+
config UCLIBC_CTOR_DTOR
bool "Support global constructors and destructors"
default y
diff --git a/ldso/libdl/Makefile.in b/ldso/libdl/Makefile.in
index 152185e..be236c8 100644
--- a/ldso/libdl/Makefile.in
+++ b/ldso/libdl/Makefile.in
@@ -20,7 +20,11 @@ endif
CFLAGS-libdl.c := -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\"
LDFLAGS-$(UCLIBC_FORMAT_DSBT_ELF)-libdl.so := -Wl,--dsbt-index=3
-LDFLAGS-libdl.so := $(LDFLAGS) -Wl,-fini,dl_cleanup
+LDFLAGS-libdl.so := $(LDFLAGS)
+
+ifeq ($(LDSO_NO_CLEANUP),)
+LDFLAGS-libdl.so += -Wl,-fini,dl_cleanup
+endif
LIBS-libdl.so := $(LIBS) $(ldso)
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c
index 4ecd1c5..2c8dfbb 100644
--- a/ldso/libdl/libdl.c
+++ b/ldso/libdl/libdl.c
@@ -260,6 +260,7 @@ remove_slotinfo(size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
}
#endif
+#ifndef __LDSO_NO_CLEANUP__
void dl_cleanup(void) __attribute__ ((destructor));
void dl_cleanup(void)
{
@@ -270,6 +271,7 @@ void dl_cleanup(void)
do_dlclose(h, 1);
}
}
+#endif
static ptrdiff_t _dl_build_local_scope (struct elf_resolve **list,
struct elf_resolve *map)
--
1.7.3.4
More information about the uClibc-cvs
mailing list