1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

* 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.
This commit is contained in:
Roland McGrath
1996-07-14 10:04:21 +00:00
parent 2064087b5f
commit c928de7902
5 changed files with 50 additions and 19 deletions

View File

@ -1,6 +1,20 @@
Sun Jul 14 01:51:39 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> Sun Jul 14 01:51:39 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* manual/Makefile (glibc-targets): Variable and targets removed. * 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.
Sat Jul 13 23:50:17 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> Sat Jul 13 23:50:17 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>

View File

@ -45,7 +45,10 @@ _dl_map_object_deps (struct link_map *map,
} }
/* Terminate the list. */ /* Terminate the list. */
head[nlist++].next = NULL; head[nlist].next = NULL;
/* Start here for adding dependencies to the list. */
tailp = &head[nlist++];
/* We use `l_reserved' as a mark bit to detect objects we have already /* We use `l_reserved' as a mark bit to detect objects we have already
put in the search list and avoid adding duplicate elements later in put in the search list and avoid adding duplicate elements later in
@ -56,7 +59,7 @@ _dl_map_object_deps (struct link_map *map,
dependencies and appending them to the list as we step through it. dependencies and appending them to the list as we step through it.
This produces a flat, ordered list that represents a breadth-first This produces a flat, ordered list that represents a breadth-first
search of the dependency tree. */ search of the dependency tree. */
for (scanp = tailp = head; scanp; scanp = scanp->next) for (scanp = head; scanp; scanp = scanp->next)
{ {
struct link_map *l = scanp->map; struct link_map *l = scanp->map;

View File

@ -52,7 +52,15 @@ _dl_open (const char *file, int mode)
{ {
if (! l->l_relocated) if (! l->l_relocated)
{ {
_dl_relocate_object (l, _dl_object_relocation_scope (l), /* 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); (mode & RTLD_BINDING_MASK) == RTLD_LAZY);
*_dl_global_scope_end = NULL; *_dl_global_scope_end = NULL;
} }

View File

@ -151,14 +151,20 @@ subdir_%: % ;
# For targets we don't define, do nothing. # For targets we don't define, do nothing.
subdir_%: ; subdir_%: ;
# These are targets that each glibc subdirectory is expected to understand.
# ../Rules defines them for code subdirectories; for us, they are no-ops.
glibc-targets := subdir_lib objects objs others tests subdir_lint.out \
subdir_echo-headers subdir_echo-distinfo stubs
.PHONY: $(glibc-targets)
$(glibc-targets):
# Create stamp files if they don't exist, so the parent makefile's rules for # Create stamp files if they don't exist, so the parent makefile's rules for
# updating the library archives are happy with us, and never think we have # updating the library archives are happy with us, and never think we have
# changed the library. # changed the library.
.PHONY: lib stubs
lib: $(foreach o,$(object-suffixes),$(objpfx)stamp$o-$(subdir)) lib: $(foreach o,$(object-suffixes),$(objpfx)stamp$o-$(subdir))
stubs: $(common-objpfx)stub-manual stubs: $(common-objpfx)stub-manual
$(objpfx)stamp%-$(subdir) $(common-objpfx)stub-manual ../po/manual.pot: $(common-objpfx)stub-manual ../po/manual.pot:; cp /dev/null $@
cp /dev/null $@ $(objpfx)stamp%-$(subdir):; cp /dev/null $@
# The top-level glibc Makefile expects subdir_install to update the stubs file. # The top-level glibc Makefile expects subdir_install to update the stubs file.
subdir_install: stubs subdir_install: stubs

View File

@ -120,7 +120,7 @@ tan (double __x)
register double __value; register double __value;
__asm __volatile__ __asm __volatile__
("fptan" ("fptan"
: "=u" (__value) : "t" (__x)); : "=t" (__value) : "0" (__x));
return __value; return __value;
} }
@ -334,13 +334,13 @@ __MATH_INLINE double
floor (double __x) floor (double __x)
{ {
register double __value; register double __value;
volatile short __cw, __cwtmp; __volatile unsigned short int __cw, __cwtmp;
__asm volatile ("fnstcw %0" : "=m" (__cw)); __asm __volatile ("fnstcw %0" : "=m" (__cw));
__cwtmp = (__cw & 0xf3ff) | 0x0400; /* rounding down */ __cwtmp = (__cw & 0xf3ff) | 0x0400; /* rounding down */
__asm volatile ("fldcw %0" : : "m" (__cwtmp)); __asm __volatile ("fldcw %0" : : "m" (__cwtmp));
__asm volatile ("frndint" : "=t" (__value) : "0" (__x)); __asm __volatile ("frndint" : "=t" (__value) : "0" (__x));
__asm volatile ("fldcw %0" : : "m" (__cw)); __asm __volatile ("fldcw %0" : : "m" (__cw));
return __value; return __value;
} }
@ -350,13 +350,13 @@ __MATH_INLINE double
ceil (double __x) ceil (double __x)
{ {
register double __value; register double __value;
volatile short __cw, __cwtmp; __volatile unsigned short int __cw, __cwtmp;
__asm volatile ("fnstcw %0" : "=m" (__cw)); __asm __volatile ("fnstcw %0" : "=m" (__cw));
__cwtmp = (__cw & 0xf3ff) | 0x0800; /* rounding up */ __cwtmp = (__cw & 0xf3ff) | 0x0800; /* rounding up */
__asm volatile ("fldcw %0" : : "m" (__cwtmp)); __asm __volatile ("fldcw %0" : : "m" (__cwtmp));
__asm volatile ("frndint" : "=t" (__value) : "0" (__x)); __asm __volatile ("frndint" : "=t" (__value) : "0" (__x));
__asm volatile ("fldcw %0" : : "m" (__cw)); __asm __volatile ("fldcw %0" : : "m" (__cw));
return __value; return __value;
} }