Message ID | 20150417213118.08ECE2C3B3B@topped-with-meat.com |
---|---|
State | New |
Headers | show |
On Fri, 2015-04-17 at 14:31 -0700, Roland McGrath wrote: > Please try this patch (branch roland/dl-nns): > > * elf/dl-close.c (_dl_close_worker) [DL_NNS == 1]: Just assert that > IMAP->l_prev cannot be null, and #if out the code for the contrary > case, avoiding 'assert (nsid != LM_ID_BASE)' making the compiler > believe that NS (&_dl_ns[NSID]) could point outside the array. This patch allowed me to compile elf/dl-close.c and my glibc build completed without any other problems. Steve Ellcey sellcey@imgtec.com
> This patch allowed me to compile elf/dl-close.c and my glibc build > completed without any other problems. Thanks. I verified that it caused no 'make check' regressions for me on x86_64-linux-gnu (GCC 4.8.2). I've committed it now. Thanks, Roland
diff --git a/elf/dl-close.c b/elf/dl-close.c index cf8f9e0..412f71d 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -641,9 +641,16 @@ _dl_close_worker (struct link_map *map) DL_UNMAP (imap); /* Finally, unlink the data structure and free it. */ - if (imap->l_prev != NULL) - imap->l_prev->l_next = imap->l_next; - else +#if DL_NNS == 1 + /* The assert in the (imap->l_prev == NULL) case gives + the compiler license to warn that NS points outside + the dl_ns array bounds in that case (as nsid != LM_ID_BASE + is tantamount to nsid >= DL_NNS). That should be impossible + in this configuration, so just assert about it instead. */ + assert (nsid == LM_ID_BASE); + assert (imap->l_prev != NULL); +#else + if (imap->l_prev == NULL) { assert (nsid != LM_ID_BASE); ns->_ns_loaded = imap->l_next; @@ -652,6 +659,9 @@ _dl_close_worker (struct link_map *map) we leave for debuggers to examine. */ r->r_map = (void *) ns->_ns_loaded; } + else +#endif + imap->l_prev->l_next = imap->l_next; --ns->_ns_nloaded; if (imap->l_next != NULL)