diff options
| author | Richard Braun <rbraun@sceen.net> | 2011-07-09 14:06:52 +0200 | 
|---|---|---|
| committer | Carmelo Amoroso <carmelo.amoroso@st.com> | 2011-07-25 09:09:03 +0200 | 
| commit | 3d5cec4ff704c2dec151f3cdbcc426d746d37fcc (patch) | |
| tree | 81210e286c1fb3a86f7c4dcbc9d9e29319c39903 | |
| parent | 63e61626c1e052c55d76861b771eda6602a14477 (diff) | |
| download | uClibc-alpine-3d5cec4ff704c2dec151f3cdbcc426d746d37fcc.tar.bz2 uClibc-alpine-3d5cec4ff704c2dec151f3cdbcc426d746d37fcc.tar.xz | |
libdl: add option for controlling dl_cleanup
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@sceen.net>
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
| -rw-r--r-- | extra/Configs/Config.in | 12 | ||||
| -rw-r--r-- | ldso/libdl/Makefile.in | 6 | ||||
| -rw-r--r-- | 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 2fa0b076d..af4c0380f 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 152185e37..be236c83f 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 4ecd1c55e..2c8dfbb79 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) | 
