diff options
author | Maciej W. Rozycki <macro@codesourcery.com> | 2014-01-31 17:51:31 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@codesourcery.com> | 2014-01-31 17:51:31 +0000 |
commit | 0d23a5c1b1908700d25b7e3c6cece148e19dded4 (patch) | |
tree | 68076816a4d5e06e01bdc0efdb433f613bb61e62 /elf | |
parent | 0037bb6010522e20dde2da7922071d5cb53f67eb (diff) | |
download | glibc-0d23a5c1b1908700d25b7e3c6cece148e19dded4.tar.gz |
[BZ #16046] Static dlopen correction fallout fixes.
Fixes to address issues from BZ #15022 resolution, as follows:
* TLS updates to csu/libc-tls.c -- we now have a proper main map, so
there's no longer a need to create a separate fake one to keep TLS
structures,
* random updates to elf/dl-close.c -- LM_ID_BASE is now a valid name
space ID for static executables as well, so assert that we don't
unload the main map. Similarly dl_nns isn't supposed to be 0 for
static executables anymore,
* actual BZ #16046 fix to elf/dl-iteratephdr.c -- the dl_iterate_phdr
special function for static executables isn't needed anymore, provided
that l_phdr and l_phnum members of the main map have been properly
initialized (done in _dl_non_dynamic_init in elf/dl-support.c now),
* ld.so.cache loader update to elf/dl-load.c --
GL(dl_ns)[LM_ID_BASE]._ns_loaded is now always initialized in static
executables so can become the fallback loader map to check for
DF_1_NODEFLIB, provided that the l_flags_1 member of the main map has
been properly initialized (done in elf/dl-support.c now); this also
ensures previous semantics elsewhere in elf/dl-load.c,
* matching updates to elf/dl-support.c -- to complement the two fixes
above.
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-close.c | 10 | ||||
-rw-r--r-- | elf/dl-iteratephdr.c | 30 | ||||
-rw-r--r-- | elf/dl-load.c | 14 | ||||
-rw-r--r-- | elf/dl-support.c | 3 |
4 files changed, 8 insertions, 49 deletions
diff --git a/elf/dl-close.c b/elf/dl-close.c index c8ffcf8ebd..5bf1de7d28 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -643,9 +643,7 @@ _dl_close_worker (struct link_map *map) imap->l_prev->l_next = imap->l_next; else { -#ifdef SHARED assert (nsid != LM_ID_BASE); -#endif ns->_ns_loaded = imap->l_next; /* Update the pointer to the head of the list @@ -736,13 +734,7 @@ _dl_close_worker (struct link_map *map) if (__builtin_expect (ns->_ns_loaded == NULL, 0) && nsid == GL(dl_nns) - 1) do - { - --GL(dl_nns); -#ifndef SHARED - if (GL(dl_nns) == 0) - break; -#endif - } + --GL(dl_nns); while (GL(dl_ns)[GL(dl_nns) - 1]._ns_loaded == NULL); /* Notify the debugger those objects are finalized and gone. */ diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c index 76e98aa2f1..6572ec3a33 100644 --- a/elf/dl-iteratephdr.c +++ b/elf/dl-iteratephdr.c @@ -86,34 +86,4 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, } hidden_def (__dl_iterate_phdr) -#ifdef SHARED - weak_alias (__dl_iterate_phdr, dl_iterate_phdr); - -#else - -int -dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, - size_t size, void *data), void *data) -{ - if (_dl_phnum != 0) - { - /* This entry describes this statically-linked program itself. */ - struct dl_phdr_info info; - int ret; - info.dlpi_addr = 0; - info.dlpi_name = ""; - info.dlpi_phdr = _dl_phdr; - info.dlpi_phnum = _dl_phnum; - info.dlpi_adds = GL(dl_load_adds); - info.dlpi_subs = GL(dl_load_adds) - GL(dl_ns)[LM_ID_BASE]._ns_nloaded; - ret = (*callback) (&info, sizeof (struct dl_phdr_info), data); - if (ret) - return ret; - } - - return __dl_iterate_phdr (callback, data); -} - - -#endif diff --git a/elf/dl-load.c b/elf/dl-load.c index ee12f329d8..1be7a3ca96 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -2233,23 +2233,17 @@ _dl_map_object (struct link_map *loader, const char *name, if (cached != NULL) { -# ifdef SHARED // XXX Correct to unconditionally default to namespace 0? l = (loader ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded - ?: &GL(dl_rtld_map)); -# else - l = loader; +# ifdef SHARED + ?: &GL(dl_rtld_map) # endif + ); /* If the loader has the DF_1_NODEFLIB flag set we must not use a cache entry from any of these directories. */ - if ( -# ifndef SHARED - /* 'l' is always != NULL for dynamically linked objects. */ - l != NULL && -# endif - __builtin_expect (l->l_flags_1 & DF_1_NODEFLIB, 0)) + if (__builtin_expect (l->l_flags_1 & DF_1_NODEFLIB, 0)) { const char *dirp = system_dirs; unsigned int cnt = 0; diff --git a/elf/dl-support.c b/elf/dl-support.c index c0d1e4c009..e435436c31 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -91,6 +91,7 @@ static struct link_map _dl_main_map = .l_scope = _dl_main_map.l_scope_mem, .l_local_scope = { &_dl_main_map.l_searchlist }, .l_used = 1, + .l_flags_1 = DF_1_NODEFLIB, .l_tls_offset = NO_TLS_OFFSET, .l_serial = 1, }; @@ -311,6 +312,8 @@ internal_function _dl_non_dynamic_init (void) { _dl_main_map.l_origin = _dl_get_origin (); + _dl_main_map.l_phdr = GL(dl_phdr); + _dl_main_map.l_phnum = GL(dl_phnum); if (HP_TIMING_AVAIL) HP_TIMING_NOW (_dl_cpuclock_offset); |