diff options
author | Guy Martin <gmsoft@tuxicoman.be> | 2013-11-21 13:23:16 -0500 |
---|---|---|
committer | Carlos O'Donell <carlos@redhat.com> | 2013-11-21 15:52:31 -0500 |
commit | daf75146de07303ea0c5ad700ec5ef703ec114a1 (patch) | |
tree | ed307e39a90288cbcdf727a7c07addb9f38f65d8 /elf/dl-close.c | |
parent | d33cafadfe365befa4ca6e0463fa926d56144046 (diff) | |
download | glibc-daf75146de07303ea0c5ad700ec5ef703ec114a1.tar.gz |
Don't use broken DL_AUTO_FUNCTION_ADDRESS()
On hppa and ia64, the macro DL_AUTO_FUNCTION_ADDRESS() uses the
variable fptr[2] in it's own scope.
The content of fptr[] is thus undefined right after the macro exits.
Newer gcc's (>= 4.7) reuse the stack space of this variable triggering
a segmentation fault in dl-init.c:69.
To fix this we rewrite the macros to make the call directly to init
and fini without needing to pass back a constructed function pointer.
Diffstat (limited to 'elf/dl-close.c')
-rw-r--r-- | elf/dl-close.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/elf/dl-close.c b/elf/dl-close.c index fe3014cca3..407926bade 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -274,9 +274,8 @@ _dl_close_worker (struct link_map *map) /* Next try the old-style destructor. */ if (imap->l_info[DT_FINI] != NULL) - (*(void (*) (void)) DL_DT_FINI_ADDRESS - (imap, ((void *) imap->l_addr - + imap->l_info[DT_FINI]->d_un.d_ptr))) (); + DL_CALL_DT_FINI (imap, ((void *) imap->l_addr + + imap->l_info[DT_FINI]->d_un.d_ptr)); } #ifdef SHARED |