From: Chris Metcalf Date: Mon, 22 Jul 2013 15:46:44 +0000 (-0400) Subject: tile BZ #15759: Fix bug in _dl_unmap X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=15256e58adc62d8d62c03b2b3ba526b468758702;p=thirdparty%2Fglibc.git tile BZ #15759: Fix bug in _dl_unmap We returned without calling __munmap if not in the simulator. Now we call a separate sim_dlclose() function to make the control flow work correctly. (cherry picked from commit 1fe2988f523ddbad93ca7abc98fea982f2ae0505) Conflicts: NEWS --- diff --git a/NEWS b/NEWS index da0f31202a9..10c1ca62acd 100644 --- a/NEWS +++ b/NEWS @@ -8,7 +8,7 @@ using `glibc' in the "product" field. Version 2.17.1 * The following bugs are resolved with this release: - 15003, 15006, 15122. + 15003, 15006, 15122, 15759. Version 2.17 diff --git a/ports/ChangeLog.tile b/ports/ChangeLog.tile index 303311d3033..f0cd08d4572 100644 --- a/ports/ChangeLog.tile +++ b/ports/ChangeLog.tile @@ -1,3 +1,9 @@ +2013-07-22 Chris Metcalf + + [BZ #15759] + * sysdeps/tile/dl-runtime.c (sim_dlclose): New function. + (_dl_unmap): Call sim_dlclose(). + 2013-06-12 Chris Metcalf * sysdeps/tile/bits/endian.h (__BYTE_ORDER): Default to little. diff --git a/ports/sysdeps/tile/dl-runtime.c b/ports/sysdeps/tile/dl-runtime.c index e965828af16..f697d574116 100644 --- a/ports/sysdeps/tile/dl-runtime.c +++ b/ports/sysdeps/tile/dl-runtime.c @@ -127,8 +127,8 @@ _dl_after_load (struct link_map *l) } /* Support notifying the simulator about removed objects prior to munmap(). */ -void internal_function -_dl_unmap (struct link_map *l) +static void +sim_dlclose (ElfW(Addr) map_start) { int shift; @@ -144,9 +144,15 @@ _dl_unmap (struct link_map *l) DLPUTC ('0'); DLPUTC ('x'); for (shift = (int) sizeof (unsigned long) * 8 - 4; shift >= 0; shift -= 4) - DLPUTC ("0123456789abcdef"[(l->l_map_start >> shift) & 0xF]); + DLPUTC ("0123456789abcdef"[(map_start >> shift) & 0xF]); DLPUTC ('\0'); + #undef DLPUTC +} +void internal_function +_dl_unmap (struct link_map *l) +{ + sim_dlclose (l->l_map_start); __munmap ((void *) l->l_map_start, l->l_map_end - l->l_map_start); }