Re: [OE-core] [PATCH] eglibc-2.14: add patch to fix libdl crash
Hello, On Mon, 03 Oct 2011, Khem Raj wrote: On 10/3/2011 2:30 AM, mo...@mnet-online.de wrote: From: Klaus Kurzmannm...@fluxnetz.de * Without this patch programs using alsa-lib crash (alsamixer for example). * This patch is taken verbatim from ArchLinux. can you add appropriate header for this? Sorry, still have to find my way into the new stuff :) Martin pointed that out to me - after I sent the mail. I tried googling to find out about the upstream status for more than an hour - without success. And glibc commit messages seem to be not very informative mostly ;) secondly this reverts the license year text from 2011 to 2010 that should not be needed. yeah, I have seen that. I think that comes from the patch being a revert (or partial revert) of some commit. If it is ok to change 'stolen' patches I can remove that. Klaus 'mrmoku' Kurzmann Signed-off-by: Klaus Kurzmannm...@fluxnetz.de --- .../eglibc-2.14/glibc-2.14-libdl-crash.patch | 132 meta/recipes-core/eglibc/eglibc_2.14.bb|3 +- 2 files changed, 134 insertions(+), 1 deletions(-) create mode 100644 meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch diff --git a/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch new file mode 100644 index 000..ee29f8c --- /dev/null +++ b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch @@ -0,0 +1,132 @@ +diff --git a/elf/dl-close.c b/elf/dl-close.c +index 73b2a2f..9bd91e3 100644 +--- a/elf/dl-close.c b/elf/dl-close.c +@@ -1,5 +1,5 @@ + /* Close a shared object opened by `_dl_open'. +- Copyright (C) 1996-2007, 2009, 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 1996-2007, 2009, 2010 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +@@ -119,17 +119,8 @@ _dl_close_worker (struct link_map *map) + if (map-l_direct_opencount 0 || map-l_type != lt_loaded + || dl_close_state != not_pending) + { +- if (map-l_direct_opencount == 0) +- { +- if (map-l_type == lt_loaded) +- dl_close_state = rerun; +- else if (map-l_type == lt_library) +- { +- struct link_map **oldp = map-l_initfini; +- map-l_initfini = map-l_orig_initfini; +- _dl_scope_free (oldp); +- } +- } ++ if (map-l_direct_opencount == 0 map-l_type == lt_loaded) ++ dl_close_state = rerun; + + /* There are still references to this object. Do nothing more. */ + if (__builtin_expect (GLRO(dl_debug_mask) DL_DEBUG_FILES, 0)) +diff --git a/elf/dl-deps.c b/elf/dl-deps.c +index 9e30594..3890d00 100644 +--- a/elf/dl-deps.c b/elf/dl-deps.c +@@ -478,6 +478,7 @@ _dl_map_object_deps (struct link_map *map, + nneeded * sizeof needed[0]); + atomic_write_barrier (); + l-l_initfini = l_initfini; ++ l-l_free_initfini = 1; +} + + /* If we have no auxiliary objects just go on to the next map. */ +@@ -681,6 +682,7 @@ Filters not supported with LD_TRACE_PRELINKING)); + l_initfini[nlist] = NULL; + atomic_write_barrier (); + map-l_initfini = l_initfini; ++ map-l_free_initfini = 1; + if (l_reldeps != NULL) + { + atomic_write_barrier (); +@@ -689,5 +691,5 @@ Filters not supported with LD_TRACE_PRELINKING)); + _dl_scope_free (old_l_reldeps); + } + if (old_l_initfini != NULL) +- map-l_orig_initfini = old_l_initfini; ++_dl_scope_free (old_l_initfini); + } +diff --git a/elf/dl-libc.c b/elf/dl-libc.c +index 7be9483..a13fce3 100644 +--- a/elf/dl-libc.c b/elf/dl-libc.c +@@ -265,13 +265,13 @@ libc_freeres_fn (free_mem) + + for (Lmid_t ns = 0; ns GL(dl_nns); ++ns) + { +- /* Remove all additional names added to the objects. */ + for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l-l_next) +{ + struct libname_list *lnp = l-l_libname-next; + + l-l_libname-next = NULL; + ++ /* Remove all additional names added to the objects. */ + while (lnp != NULL) +{ + struct libname_list *old = lnp; +@@ -279,6 +279,10 @@ libc_freeres_fn (free_mem) + if (! old-dont_free) +free (old); +} ++ ++ /* Free the initfini dependency list. */ ++ if (l-l_free_initfini) ++ free (l-l_initfini); +} + + if (__builtin_expect (GL(dl_ns)[ns]._ns_global_scope_alloc, 0) != 0 +diff --git a/elf/rtld.c b/elf/rtld.c +index 4a9109e..617e30e 100644 +--- a/elf/rtld.c b/elf/rtld.c +@@ -2251,6 +2251,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n, + lnp-dont_free = 1; + lnp = lnp-next; +} ++ l-l_free_initfini = 0; + + if (l !=GL(dl_rtld_map)) +
Re: [OE-core] [PATCH] eglibc-2.14: add patch to fix libdl crash
On Tue, Oct 4, 2011 at 1:05 PM, Klaus 'mrmoku' Kurzmann mo...@mnet-online.de wrote: Hello, On Mon, 03 Oct 2011, Khem Raj wrote: On 10/3/2011 2:30 AM, mo...@mnet-online.de wrote: From: Klaus Kurzmannm...@fluxnetz.de * Without this patch programs using alsa-lib crash (alsamixer for example). * This patch is taken verbatim from ArchLinux. can you add appropriate header for this? Sorry, still have to find my way into the new stuff :) Martin pointed that out to me - after I sent the mail. I tried googling to find out about the upstream status for more than an hour - without success. And glibc commit messages seem to be not very informative mostly ;) the patch is not applied upstream last time I looked quickly. secondly this reverts the license year text from 2011 to 2010 that should not be needed. yeah, I have seen that. I think that comes from the patch being a revert (or partial revert) of some commit. If it is ok to change 'stolen' patches I can remove that.\ yes licenses dont change because of a single revert there might be more changes that were done in that time frame which should have used the current year. Klaus 'mrmoku' Kurzmann Signed-off-by: Klaus Kurzmannm...@fluxnetz.de --- .../eglibc-2.14/glibc-2.14-libdl-crash.patch | 132 meta/recipes-core/eglibc/eglibc_2.14.bb | 3 +- 2 files changed, 134 insertions(+), 1 deletions(-) create mode 100644 meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch diff --git a/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch new file mode 100644 index 000..ee29f8c --- /dev/null +++ b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch @@ -0,0 +1,132 @@ +diff --git a/elf/dl-close.c b/elf/dl-close.c +index 73b2a2f..9bd91e3 100644 +--- a/elf/dl-close.c b/elf/dl-close.c +@@ -1,5 +1,5 @@ + /* Close a shared object opened by `_dl_open'. +- Copyright (C) 1996-2007, 2009, 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 1996-2007, 2009, 2010 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -119,17 +119,8 @@ _dl_close_worker (struct link_map *map) + if (map-l_direct_opencount 0 || map-l_type != lt_loaded + || dl_close_state != not_pending) + { +- if (map-l_direct_opencount == 0) +- { +- if (map-l_type == lt_loaded) +- dl_close_state = rerun; +- else if (map-l_type == lt_library) +- { +- struct link_map **oldp = map-l_initfini; +- map-l_initfini = map-l_orig_initfini; +- _dl_scope_free (oldp); +- } +- } ++ if (map-l_direct_opencount == 0 map-l_type == lt_loaded) ++ dl_close_state = rerun; + + /* There are still references to this object. Do nothing more. */ + if (__builtin_expect (GLRO(dl_debug_mask) DL_DEBUG_FILES, 0)) +diff --git a/elf/dl-deps.c b/elf/dl-deps.c +index 9e30594..3890d00 100644 +--- a/elf/dl-deps.c b/elf/dl-deps.c +@@ -478,6 +478,7 @@ _dl_map_object_deps (struct link_map *map, + nneeded * sizeof needed[0]); + atomic_write_barrier (); + l-l_initfini = l_initfini; ++ l-l_free_initfini = 1; + } + + /* If we have no auxiliary objects just go on to the next map. */ +@@ -681,6 +682,7 @@ Filters not supported with LD_TRACE_PRELINKING)); + l_initfini[nlist] = NULL; + atomic_write_barrier (); + map-l_initfini = l_initfini; ++ map-l_free_initfini = 1; + if (l_reldeps != NULL) + { + atomic_write_barrier (); +@@ -689,5 +691,5 @@ Filters not supported with LD_TRACE_PRELINKING)); + _dl_scope_free (old_l_reldeps); + } + if (old_l_initfini != NULL) +- map-l_orig_initfini = old_l_initfini; ++ _dl_scope_free (old_l_initfini); + } +diff --git a/elf/dl-libc.c b/elf/dl-libc.c +index 7be9483..a13fce3 100644 +--- a/elf/dl-libc.c b/elf/dl-libc.c +@@ -265,13 +265,13 @@ libc_freeres_fn (free_mem) + + for (Lmid_t ns = 0; ns GL(dl_nns); ++ns) + { +- /* Remove all additional names added to the objects. */ + for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l-l_next) + { + struct libname_list *lnp = l-l_libname-next; + + l-l_libname-next = NULL; + ++ /* Remove all additional names added to the objects. */ + while (lnp != NULL) + { + struct libname_list *old = lnp; +@@ -279,6 +279,10 @@ libc_freeres_fn (free_mem) + if (! old-dont_free) + free (old); + } ++ ++ /* Free the initfini dependency list. */ ++ if (l-l_free_initfini) ++ free (l-l_initfini); + } + + if (__builtin_expect (GL(dl_ns)[ns]._ns_global_scope_alloc, 0) != 0 +diff --git a/elf/rtld.c b/elf/rtld.c +index
Re: [OE-core] [PATCH] eglibc-2.14: add patch to fix libdl crash
On 10/04/2011 01:17 PM, Khem Raj wrote: On Tue, Oct 4, 2011 at 1:05 PM, Klaus 'mrmoku' Kurzmann mo...@mnet-online.de wrote: Hello, On Mon, 03 Oct 2011, Khem Raj wrote: On 10/3/2011 2:30 AM, mo...@mnet-online.de wrote: From: Klaus Kurzmannm...@fluxnetz.de * Without this patch programs using alsa-lib crash (alsamixer for example). * This patch is taken verbatim from ArchLinux. can you add appropriate header for this? Sorry, still have to find my way into the new stuff :) Martin pointed that out to me - after I sent the mail. I tried googling to find out about the upstream status for more than an hour - without success. And glibc commit messages seem to be not very informative mostly ;) I think you should look at the following wiki page for the header and SOB info: http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines Sau! the patch is not applied upstream last time I looked quickly. secondly this reverts the license year text from 2011 to 2010 that should not be needed. yeah, I have seen that. I think that comes from the patch being a revert (or partial revert) of some commit. If it is ok to change 'stolen' patches I can remove that.\ yes licenses dont change because of a single revert there might be more changes that were done in that time frame which should have used the current year. Klaus 'mrmoku' Kurzmann Signed-off-by: Klaus Kurzmannm...@fluxnetz.de --- .../eglibc-2.14/glibc-2.14-libdl-crash.patch | 132 meta/recipes-core/eglibc/eglibc_2.14.bb|3 +- 2 files changed, 134 insertions(+), 1 deletions(-) create mode 100644 meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch diff --git a/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch new file mode 100644 index 000..ee29f8c --- /dev/null +++ b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch @@ -0,0 +1,132 @@ +diff --git a/elf/dl-close.c b/elf/dl-close.c +index 73b2a2f..9bd91e3 100644 +--- a/elf/dl-close.c b/elf/dl-close.c +@@ -1,5 +1,5 @@ + /* Close a shared object opened by `_dl_open'. +- Copyright (C) 1996-2007, 2009, 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 1996-2007, 2009, 2010 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +@@ -119,17 +119,8 @@ _dl_close_worker (struct link_map *map) + if (map-l_direct_opencount0 || map-l_type != lt_loaded + || dl_close_state != not_pending) + { +- if (map-l_direct_opencount == 0) +- { +- if (map-l_type == lt_loaded) +- dl_close_state = rerun; +- else if (map-l_type == lt_library) +- { +- struct link_map **oldp = map-l_initfini; +- map-l_initfini = map-l_orig_initfini; +- _dl_scope_free (oldp); +- } +- } ++ if (map-l_direct_opencount == 0map-l_type == lt_loaded) ++ dl_close_state = rerun; + + /* There are still references to this object. Do nothing more. */ + if (__builtin_expect (GLRO(dl_debug_mask)DL_DEBUG_FILES, 0)) +diff --git a/elf/dl-deps.c b/elf/dl-deps.c +index 9e30594..3890d00 100644 +--- a/elf/dl-deps.c b/elf/dl-deps.c +@@ -478,6 +478,7 @@ _dl_map_object_deps (struct link_map *map, + nneeded * sizeof needed[0]); + atomic_write_barrier (); + l-l_initfini = l_initfini; ++ l-l_free_initfini = 1; +} + + /* If we have no auxiliary objects just go on to the next map. */ +@@ -681,6 +682,7 @@ Filters not supported with LD_TRACE_PRELINKING)); + l_initfini[nlist] = NULL; + atomic_write_barrier (); + map-l_initfini = l_initfini; ++ map-l_free_initfini = 1; + if (l_reldeps != NULL) + { + atomic_write_barrier (); +@@ -689,5 +691,5 @@ Filters not supported with LD_TRACE_PRELINKING)); + _dl_scope_free (old_l_reldeps); + } + if (old_l_initfini != NULL) +- map-l_orig_initfini = old_l_initfini; ++_dl_scope_free (old_l_initfini); + } +diff --git a/elf/dl-libc.c b/elf/dl-libc.c +index 7be9483..a13fce3 100644 +--- a/elf/dl-libc.c b/elf/dl-libc.c +@@ -265,13 +265,13 @@ libc_freeres_fn (free_mem) + + for (Lmid_t ns = 0; nsGL(dl_nns); ++ns) + { +- /* Remove all additional names added to the objects. */ + for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l-l_next) +{ + struct libname_list *lnp = l-l_libname-next; + + l-l_libname-next = NULL; + ++ /* Remove all additional names added to the objects. */ + while (lnp != NULL) +{ + struct libname_list *old = lnp; +@@ -279,6 +279,10 @@ libc_freeres_fn (free_mem) + if (! old-dont_free) +free (old); +} ++ ++ /* Free the initfini dependency list. */ ++ if (l-l_free_initfini) ++ free (l-l_initfini); +} + + if (__builtin_expect
[OE-core] [PATCH] eglibc-2.14: add patch to fix libdl crash
From: Klaus Kurzmann m...@fluxnetz.de * Without this patch programs using alsa-lib crash (alsamixer for example). * This patch is taken verbatim from ArchLinux. Signed-off-by: Klaus Kurzmann m...@fluxnetz.de --- .../eglibc-2.14/glibc-2.14-libdl-crash.patch | 132 meta/recipes-core/eglibc/eglibc_2.14.bb|3 +- 2 files changed, 134 insertions(+), 1 deletions(-) create mode 100644 meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch diff --git a/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch new file mode 100644 index 000..ee29f8c --- /dev/null +++ b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch @@ -0,0 +1,132 @@ +diff --git a/elf/dl-close.c b/elf/dl-close.c +index 73b2a2f..9bd91e3 100644 +--- a/elf/dl-close.c b/elf/dl-close.c +@@ -1,5 +1,5 @@ + /* Close a shared object opened by `_dl_open'. +- Copyright (C) 1996-2007, 2009, 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 1996-2007, 2009, 2010 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +@@ -119,17 +119,8 @@ _dl_close_worker (struct link_map *map) + if (map-l_direct_opencount 0 || map-l_type != lt_loaded + || dl_close_state != not_pending) + { +- if (map-l_direct_opencount == 0) +- { +-if (map-l_type == lt_loaded) +- dl_close_state = rerun; +-else if (map-l_type == lt_library) +- { +-struct link_map **oldp = map-l_initfini; +-map-l_initfini = map-l_orig_initfini; +-_dl_scope_free (oldp); +- } +- } ++ if (map-l_direct_opencount == 0 map-l_type == lt_loaded) ++ dl_close_state = rerun; + + /* There are still references to this object. Do nothing more. */ + if (__builtin_expect (GLRO(dl_debug_mask) DL_DEBUG_FILES, 0)) +diff --git a/elf/dl-deps.c b/elf/dl-deps.c +index 9e30594..3890d00 100644 +--- a/elf/dl-deps.c b/elf/dl-deps.c +@@ -478,6 +478,7 @@ _dl_map_object_deps (struct link_map *map, + nneeded * sizeof needed[0]); + atomic_write_barrier (); + l-l_initfini = l_initfini; ++l-l_free_initfini = 1; + } + + /* If we have no auxiliary objects just go on to the next map. */ +@@ -681,6 +682,7 @@ Filters not supported with LD_TRACE_PRELINKING)); + l_initfini[nlist] = NULL; + atomic_write_barrier (); + map-l_initfini = l_initfini; ++ map-l_free_initfini = 1; + if (l_reldeps != NULL) + { + atomic_write_barrier (); +@@ -689,5 +691,5 @@ Filters not supported with LD_TRACE_PRELINKING)); + _dl_scope_free (old_l_reldeps); + } + if (old_l_initfini != NULL) +- map-l_orig_initfini = old_l_initfini; ++_dl_scope_free (old_l_initfini); + } +diff --git a/elf/dl-libc.c b/elf/dl-libc.c +index 7be9483..a13fce3 100644 +--- a/elf/dl-libc.c b/elf/dl-libc.c +@@ -265,13 +265,13 @@ libc_freeres_fn (free_mem) + + for (Lmid_t ns = 0; ns GL(dl_nns); ++ns) + { +- /* Remove all additional names added to the objects. */ + for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l-l_next) + { + struct libname_list *lnp = l-l_libname-next; + + l-l_libname-next = NULL; + ++/* Remove all additional names added to the objects. */ + while (lnp != NULL) + { + struct libname_list *old = lnp; +@@ -279,6 +279,10 @@ libc_freeres_fn (free_mem) + if (! old-dont_free) + free (old); + } ++ ++/* Free the initfini dependency list. */ ++if (l-l_free_initfini) ++ free (l-l_initfini); + } + + if (__builtin_expect (GL(dl_ns)[ns]._ns_global_scope_alloc, 0) != 0 +diff --git a/elf/rtld.c b/elf/rtld.c +index 4a9109e..617e30e 100644 +--- a/elf/rtld.c b/elf/rtld.c +@@ -2251,6 +2251,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n, + lnp-dont_free = 1; + lnp = lnp-next; + } ++l-l_free_initfini = 0; + + if (l != GL(dl_rtld_map)) + _dl_relocate_object (l, l-l_scope, GLRO(dl_lazy) ? RTLD_LAZY : 0, +diff --git a/include/link.h b/include/link.h +index e877104..051b99a 100644 +--- a/include/link.h b/include/link.h +@@ -1,6 +1,6 @@ + /* Data structure for communication from the run-time dynamic linker for +loaded ELF shared objects. +- Copyright (C) 1995-2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 1995-2006, 2007, 2009, 2010 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +@@ -192,6 +192,9 @@ struct link_map +during LD_TRACE_PRELINKING=1 +
Re: [OE-core] [PATCH] eglibc-2.14: add patch to fix libdl crash
On 10/3/2011 2:30 AM, mo...@mnet-online.de wrote: From: Klaus Kurzmannm...@fluxnetz.de * Without this patch programs using alsa-lib crash (alsamixer for example). * This patch is taken verbatim from ArchLinux. can you add appropriate header for this? secondly this reverts the license year text from 2011 to 2010 that should not be needed. Signed-off-by: Klaus Kurzmannm...@fluxnetz.de --- .../eglibc-2.14/glibc-2.14-libdl-crash.patch | 132 meta/recipes-core/eglibc/eglibc_2.14.bb|3 +- 2 files changed, 134 insertions(+), 1 deletions(-) create mode 100644 meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch diff --git a/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch new file mode 100644 index 000..ee29f8c --- /dev/null +++ b/meta/recipes-core/eglibc/eglibc-2.14/glibc-2.14-libdl-crash.patch @@ -0,0 +1,132 @@ +diff --git a/elf/dl-close.c b/elf/dl-close.c +index 73b2a2f..9bd91e3 100644 +--- a/elf/dl-close.c b/elf/dl-close.c +@@ -1,5 +1,5 @@ + /* Close a shared object opened by `_dl_open'. +- Copyright (C) 1996-2007, 2009, 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 1996-2007, 2009, 2010 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +@@ -119,17 +119,8 @@ _dl_close_worker (struct link_map *map) + if (map-l_direct_opencount 0 || map-l_type != lt_loaded + || dl_close_state != not_pending) + { +- if (map-l_direct_opencount == 0) +- { +-if (map-l_type == lt_loaded) +- dl_close_state = rerun; +-else if (map-l_type == lt_library) +- { +-struct link_map **oldp = map-l_initfini; +-map-l_initfini = map-l_orig_initfini; +-_dl_scope_free (oldp); +- } +- } ++ if (map-l_direct_opencount == 0 map-l_type == lt_loaded) ++ dl_close_state = rerun; + + /* There are still references to this object. Do nothing more. */ + if (__builtin_expect (GLRO(dl_debug_mask) DL_DEBUG_FILES, 0)) +diff --git a/elf/dl-deps.c b/elf/dl-deps.c +index 9e30594..3890d00 100644 +--- a/elf/dl-deps.c b/elf/dl-deps.c +@@ -478,6 +478,7 @@ _dl_map_object_deps (struct link_map *map, + nneeded * sizeof needed[0]); + atomic_write_barrier (); + l-l_initfini = l_initfini; ++l-l_free_initfini = 1; + } + + /* If we have no auxiliary objects just go on to the next map. */ +@@ -681,6 +682,7 @@ Filters not supported with LD_TRACE_PRELINKING)); + l_initfini[nlist] = NULL; + atomic_write_barrier (); + map-l_initfini = l_initfini; ++ map-l_free_initfini = 1; + if (l_reldeps != NULL) + { + atomic_write_barrier (); +@@ -689,5 +691,5 @@ Filters not supported with LD_TRACE_PRELINKING)); + _dl_scope_free (old_l_reldeps); + } + if (old_l_initfini != NULL) +- map-l_orig_initfini = old_l_initfini; ++_dl_scope_free (old_l_initfini); + } +diff --git a/elf/dl-libc.c b/elf/dl-libc.c +index 7be9483..a13fce3 100644 +--- a/elf/dl-libc.c b/elf/dl-libc.c +@@ -265,13 +265,13 @@ libc_freeres_fn (free_mem) + + for (Lmid_t ns = 0; ns GL(dl_nns); ++ns) + { +- /* Remove all additional names added to the objects. */ + for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l-l_next) + { + struct libname_list *lnp = l-l_libname-next; + + l-l_libname-next = NULL; + ++/* Remove all additional names added to the objects. */ + while (lnp != NULL) + { + struct libname_list *old = lnp; +@@ -279,6 +279,10 @@ libc_freeres_fn (free_mem) + if (! old-dont_free) + free (old); + } ++ ++/* Free the initfini dependency list. */ ++if (l-l_free_initfini) ++ free (l-l_initfini); + } + + if (__builtin_expect (GL(dl_ns)[ns]._ns_global_scope_alloc, 0) != 0 +diff --git a/elf/rtld.c b/elf/rtld.c +index 4a9109e..617e30e 100644 +--- a/elf/rtld.c b/elf/rtld.c +@@ -2251,6 +2251,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n, + lnp-dont_free = 1; + lnp = lnp-next; + } ++l-l_free_initfini = 0; + + if (l !=GL(dl_rtld_map)) + _dl_relocate_object (l, l-l_scope, GLRO(dl_lazy) ? RTLD_LAZY : 0, +diff --git a/include/link.h b/include/link.h +index e877104..051b99a 100644 +--- a/include/link.h b/include/link.h +@@ -1,6 +1,6 @@ + /* Data structure for communication from the run-time dynamic linker for +loaded ELF shared objects. +- Copyright (C) 1995-2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. ++ Copyright (C) 1995-2006, 2007, 2009, 2010 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is