diff options
author | Roland McGrath <roland@gnu.org> | 1996-07-14 10:04:21 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1996-07-14 10:04:21 +0000 |
commit | c928de790200bc7a81224377d35a91a6103387de (patch) | |
tree | 470cac87d54b6d7fe1d25f3a4b0864779de900fe /elf/dl-open.c | |
parent | 2064087b5f1a0a3a189fcd6a3012376f5545be31 (diff) | |
download | glibc-c928de790200bc7a81224377d35a91a6103387de.zip glibc-c928de790200bc7a81224377d35a91a6103387de.tar.gz glibc-c928de790200bc7a81224377d35a91a6103387de.tar.bz2 |
* elf/dl-deps.c (_dl_map_object_deps): Start TAILP at last preload.
* elf/dl-open.c (_dl_open): Force an indirect call for
_dl_relocate_object so there is no chance a PLT fixup will be done
and clobber _dl_global_scope before our call happens.
* sysdeps/i386/fpu/__math.h (tan): Correct output constraint from =u
to =t; must operate on top of fp reg stack, not second from top.
Correct input constraint to 0 from t; must be explicit when input and
output are the same register.
(floor): Use __volatile instead of volatile.
(ceil): Likewise.
* manual/Makefile ($(objpfx)stamp%-$(subdir)): Separate rule from
other targets.
Diffstat (limited to 'elf/dl-open.c')
-rw-r--r-- | elf/dl-open.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/elf/dl-open.c b/elf/dl-open.c index 058c3e5..021c4be 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -52,8 +52,16 @@ _dl_open (const char *file, int mode) { if (! l->l_relocated) { - _dl_relocate_object (l, _dl_object_relocation_scope (l), - (mode & RTLD_BINDING_MASK) == RTLD_LAZY); + /* We use an indirect call call for _dl_relocate_object because + we must avoid using the PLT in the call. If our PLT entry for + _dl_relocate_object hasn't been used yet, then the dynamic + linker fixup routine will clobber _dl_global_scope during its + work. We must be sure that nothing will require a PLT fixup + between when _dl_object_relocation_scope returns and when we + enter the dynamic linker's code (_dl_relocate_object). */ + __typeof (_dl_relocate_object) *reloc = &_dl_relocate_object; + (*reloc) (l, _dl_object_relocation_scope (l), + (mode & RTLD_BINDING_MASK) == RTLD_LAZY); *_dl_global_scope_end = NULL; } |