about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-03-23 01:54:07 +0000
committerUlrich Drepper <drepper@redhat.com>1997-03-23 01:54:07 +0000
commitbc9f6000f6752153e5e1902259d5f491a88a1ae5 (patch)
treeaffff963d9f44f476e13e4ee673f67509456096f /elf
parent5ae9d168f66cc6b40f74cfb4a8f2631fc1df6a2a (diff)
downloadglibc-bc9f6000f6752153e5e1902259d5f491a88a1ae5.tar.gz
glibc-bc9f6000f6752153e5e1902259d5f491a88a1ae5.tar.xz
glibc-bc9f6000f6752153e5e1902259d5f491a88a1ae5.zip
1997-03-23 02:11  Ulrich Drepper  <drepper@cygnus.com>

	* time/sys/time.h: Make values ITIMER_* also available as macros.

	* elf/dl-support.c (_dl_sysdep_read_whole_file): Don't call
	__fstat but instead __fxstat directly to avoid dependency on
	libc.a when inline failed.
	* sysdeps/generic/dl-sysdep.c (_dl_sysdep_read_whole_file): Likewise.

	* math/Makefile (libm-routines): Add s_remquo.
	* sysdeps/libm-i387/s_remquo.S: New file.
	* sysdeps/libm-i387/s_remquof.S: New file.
	* sysdeps/libm-i387/s_remquol.S: New file.
	* sysdeps/libm-ieee754/s_remquo.c: New file.
	* sysdeps/libm-ieee754/s_remquof.c: New file.
	* sysdeps/libm-ieee754/s_remquol.c: New file.

	* math/libm-test.c (remquo_test): New function.

	* sysdeps/libm-ieee754/s_rintl.c: Handle implicit leading one
	correctly.

1997-03-22 14:06  Ulrich Drepper  <drepper@cygnus.com>

	* math/Makefile (libm-calls): Add s_nan.
	* sysdeps/libm-ieee754/s_nan.c: New file.  Implement `nan' function.
	* sysdeps/libm-ieee754/s_nanf.c: New file.  Implement `nanf' function.
	* sysdeps/libm-ieee754/s_nanl.c: New file.  Implement `nanl' function.

	* math/libm-test.c (basic_tests): Add tests for `nan' function.

	* math/libm-test.c (copysign_test): New function.
	(main): Call copysign_test.

1997-03-22 06:28  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-ieee754/s_nextafter.c: Return y if x == y.
	* sysdeps/libm-ieee754/s_nextafterf.c: Likewise.
	* sysdeps/libm-ieee754/s_nextafterl.c: Likewise.
	* sysdeps/libm-i387/s_nextafterl.c: Likewise.

	* math/libm-test.c (fdim_test, fmin_test, fmax_test, nextafter_test):
	New functions.  Test these functions.
	(main): Call above new functions.

1997-03-22 04:53  Ulrich Drepper  <drepper@cygnus.com>

	* Net release 2.0.2.

1997-03-22 04:37  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/termbits.h (OXTABS): Define as alias for
	XTABS.
	* sysdeps/unix/sysv/linux/alpha/termbits.h (OXTABS): Likewise.
	* termios/sys/ttydefaults.h: Partly revert patch by Andreas Schwab
	of Sun Dec 15 16:33:44 1996.
	Proposed by Thomas Bushnell <thomas@gnu.ai.mit.edu>.

1997-03-21 13:41  Roland McGrath  <roland@baalperazim.frob.com>

	* sysdeps/sparc/dl-machine.h (elf_machine_rel): Rewritten as for i386.
	Check here for non-SHN_UNDEF STB_LOCAL symbols don't do any lookup or
	consult their values.
	(elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p,
	ELF_MACHINE_RELOC_NOPLT): New macros.

	* elf/rtld.c (dl_main): Pass ELF_MACHINE_RELOC_NOPLT to
	_dl_lookup_symbol in place of DL_LOOKUP_NOPLT.
	* sysdeps/i386/dl-machine.h (ELF_MACHINE_RELOC_NOPLT): New macro.

	* sysdeps/i386/dl-machine.h (elf_machine_rel): Rewritten to do the
	symbol lookup before checking reloc type except for R_386_RELATIVE.
	(elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p): New macros.

	* elf/dl-reloc.c (RESOLVE): Remove STB_LOCAL check; let it be
	per-machine since it supposedly can't happen on i386.

	* elf/dl-lookup.c (do_lookup): Change arg FLAGS to RELOC_TYPE.  Use
	elf_machine_lookup_{noexec,noplt}_p macros on it.  Remove gratuitous
	indirection from REF arg; change callers.
	(_dl_lookup_symbol, _dl_lookup_versioned_symbol): Change arg name.
	(_dl_lookup_symbol_skip, _dl_lookup_versioned_symbol_skip): Remove
	FLAGS arg altogether.
	* elf/dlsym.c: Remove argument of FLAGS parameter.
	* elf/dlvsym.c: Likewise.
	* elf/link.h: Update decls.

	* Makefile (distribute): Add BUGS.
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-lookup.c54
-rw-r--r--elf/dl-reloc.c5
-rw-r--r--elf/dl-support.c4
-rw-r--r--elf/dlsym.c3
-rw-r--r--elf/dlvsym.c2
-rw-r--r--elf/link.h21
-rw-r--r--elf/rtld.c2
7 files changed, 40 insertions, 51 deletions
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index 8702a85bbb..f85aa373c2 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -22,7 +22,8 @@
 #include <assert.h>
 #include <string.h>
 
-#include <dl-hash.h>
+#include "dl-hash.h"
+#include <dl-machine.h>
 #include "../stdio-common/_itoa.h"
 
 #define VERSTAG(tag)	(DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (tag))
@@ -57,10 +58,10 @@ struct sym_val
    something bad happened.  */
 static inline int
 do_lookup (const char *undef_name, unsigned long int hash,
-	   const ElfW(Sym) **ref, struct sym_val *result,
+	   const ElfW(Sym) *ref, struct sym_val *result,
 	   struct link_map *list[], size_t i, size_t n,
 	   const char *reference_name, const struct r_found_version *version,
-	   struct link_map *skip, int flags)
+	   struct link_map *skip, int reloc_type)
 {
   struct link_map *map;
 
@@ -78,7 +79,8 @@ do_lookup (const char *undef_name, unsigned long int hash,
 	continue;
 
       /* Don't search the executable when resolving a copy reloc.  */
-      if (flags & DL_LOOKUP_NOEXEC && map->l_type == lt_executable)
+      if (elf_machine_lookup_noexec_p (reloc_type) &&
+	  map->l_type == lt_executable)
 	continue;
 
       symtab = ((void *) map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
@@ -98,7 +100,7 @@ do_lookup (const char *undef_name, unsigned long int hash,
 	  const ElfW(Sym) *sym = &symtab[symidx];
 
 	  if (sym->st_value == 0 || /* No value.  */
-	      ((flags & DL_LOOKUP_NOPLT) != 0 /* Reject PLT entry.  */
+	      (elf_machine_lookup_noplt_p (reloc_type) /* Reject PLT entry.  */
 	       && sym->st_shndx == SHN_UNDEF))
 	    continue;
 
@@ -113,7 +115,7 @@ do_lookup (const char *undef_name, unsigned long int hash,
 	      continue;
 	    }
 
-	  if (sym != *ref && strcmp (strtab + sym->st_name, undef_name))
+	  if (sym != ref && strcmp (strtab + sym->st_name, undef_name))
 	    /* Not the symbol we are looking for.  */
 	    continue;
 
@@ -188,16 +190,13 @@ do_lookup (const char *undef_name, unsigned long int hash,
 }
 
 /* Search loaded objects' symbol tables for a definition of the symbol
-   UNDEF_NAME.  FLAGS is a set of flags.  If DL_LOOKUP_NOEXEC is set,
-   then don't search the executable for a definition; this used for
-   copy relocs.  If DL_LOOKUP_NOPLT is set, then a PLT entry cannot
-   satisfy the reference; some different binding must be found.  */
+   UNDEF_NAME.  */
 
 ElfW(Addr)
 _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
 		   struct link_map *symbol_scope[],
 		   const char *reference_name,
-		   int flags)
+		   int reloc_type)
 {
   const unsigned long int hash = _dl_elf_hash (undef_name);
   struct sym_val current_value = { 0, NULL };
@@ -205,9 +204,9 @@ _dl_lookup_symbol (const char *undef_name, const ElfW(Sym) **ref,
 
   /* Search the relevant loaded objects for a definition.  */
   for (scope = symbol_scope; *scope; ++scope)
-    if (do_lookup (undef_name, hash, ref, &current_value,
+    if (do_lookup (undef_name, hash, *ref, &current_value,
 		   (*scope)->l_searchlist, 0, (*scope)->l_nsearchlist,
-		   reference_name, NULL, NULL, flags))
+		   reference_name, NULL, NULL, reloc_type))
       break;
 
   if (current_value.s == NULL &&
@@ -230,8 +229,7 @@ ElfW(Addr)
 _dl_lookup_symbol_skip (const char *undef_name, const ElfW(Sym) **ref,
 			struct link_map *symbol_scope[],
 			const char *reference_name,
-			struct link_map *skip_map,
-			int flags)
+			struct link_map *skip_map)
 {
   const unsigned long int hash = _dl_elf_hash (undef_name);
   struct sym_val current_value = { 0, NULL };
@@ -243,13 +241,13 @@ _dl_lookup_symbol_skip (const char *undef_name, const ElfW(Sym) **ref,
   for (i = 0; (*scope)->l_dupsearchlist[i] != skip_map; ++i)
     assert (i < (*scope)->l_ndupsearchlist);
 
-  if (! do_lookup (undef_name, hash, ref, &current_value,
+  if (! do_lookup (undef_name, hash, *ref, &current_value,
 		   (*scope)->l_dupsearchlist, i, (*scope)->l_ndupsearchlist,
-		   reference_name, NULL, skip_map, flags))
+		   reference_name, NULL, skip_map, 0))
     while (*++scope)
-      if (do_lookup (undef_name, hash, ref, &current_value,
+      if (do_lookup (undef_name, hash, *ref, &current_value,
 		     (*scope)->l_dupsearchlist, 0, (*scope)->l_ndupsearchlist,
-		     reference_name, NULL, skip_map, flags))
+		     reference_name, NULL, skip_map, 0))
 	break;
 
   *ref = current_value.s;
@@ -266,7 +264,8 @@ ElfW(Addr)
 _dl_lookup_versioned_symbol (const char *undef_name, const ElfW(Sym) **ref,
 			     struct link_map *symbol_scope[],
 			     const char *reference_name,
-			     const struct r_found_version *version, int flags)
+			     const struct r_found_version *version,
+			     int reloc_type)
 {
   const unsigned long int hash = _dl_elf_hash (undef_name);
   struct sym_val current_value = { 0, NULL };
@@ -275,9 +274,9 @@ _dl_lookup_versioned_symbol (const char *undef_name, const ElfW(Sym) **ref,
   /* Search the relevant loaded objects for a definition.  */
   for (scope = symbol_scope; *scope; ++scope)
     {
-      int res = do_lookup (undef_name, hash, ref, &current_value,
+      int res = do_lookup (undef_name, hash, *ref, &current_value,
 			   (*scope)->l_searchlist, 0, (*scope)->l_nsearchlist,
-			   reference_name, version, NULL, flags);
+			   reference_name, version, NULL, reloc_type);
       if (res > 0)
 	break;
 
@@ -312,8 +311,7 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
 				  struct link_map *symbol_scope[],
 				  const char *reference_name,
 				  const struct r_found_version *version,
-				  struct link_map *skip_map,
-				  int flags)
+				  struct link_map *skip_map)
 {
   const unsigned long int hash = _dl_elf_hash (undef_name);
   struct sym_val current_value = { 0, NULL };
@@ -325,13 +323,13 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
   for (i = 0; (*scope)->l_dupsearchlist[i] != skip_map; ++i)
     assert (i < (*scope)->l_ndupsearchlist);
 
-  if (! do_lookup (undef_name, hash, ref, &current_value,
+  if (! do_lookup (undef_name, hash, *ref, &current_value,
 		   (*scope)->l_dupsearchlist, i, (*scope)->l_ndupsearchlist,
-		   reference_name, version, skip_map, flags))
+		   reference_name, version, skip_map, 0))
     while (*++scope)
-      if (do_lookup (undef_name, hash, ref, &current_value,
+      if (do_lookup (undef_name, hash, *ref, &current_value,
 		     (*scope)->l_dupsearchlist, 0, (*scope)->l_ndupsearchlist,
-		     reference_name, version, skip_map, flags))
+		     reference_name, version, skip_map, 0))
 	break;
 
   *ref = current_value.s;
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index d2122a8bdf..f1c43ea174 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -58,10 +58,7 @@ _dl_relocate_object (struct link_map *l, struct link_map *scope[], int lazy)
 
     /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
 #define RESOLVE(ref, version, flags) \
-    ((*ref)->st_shndx != SHN_UNDEF &&					      \
-     ELFW(ST_BIND) ((*ref)->st_info) == STB_LOCAL	      		      \
-     ? l->l_addr :			      				      \
-     (version) != NULL && (version)->hash != 0				      \
+    ((version) != NULL && (version)->hash != 0				      \
      ? _dl_lookup_versioned_symbol (strtab + (*ref)->st_name, (ref), scope,   \
 				    l->l_name, (version), (flags))	      \
      : _dl_lookup_symbol (strtab + (*ref)->st_name, (ref), scope,	      \
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 593f96749b..5c70b4f263 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -1,5 +1,5 @@
 /* Support for dynamic linking code in static libc.
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -62,7 +62,7 @@ _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
   int fd = __open (file, O_RDONLY);
   if (fd < 0)
     return NULL;
-  if (__fstat (fd, &st) < 0)
+  if (__fxstat (_STAT_VER, fd, &st) < 0)
     result = NULL;
   else
     {
diff --git a/elf/dlsym.c b/elf/dlsym.c
index 73f6e86475..d05619bfb4 100644
--- a/elf/dlsym.c
+++ b/elf/dlsym.c
@@ -53,8 +53,7 @@ RTLD_NEXT used in code not dynamically loaded"));
 	  while (l->l_loader)
 	    l = l->l_loader;
 
-	  loadbase = _dl_lookup_symbol_skip
-	    (name, &ref, &_dl_loaded, NULL, l, 0);
+	  loadbase = _dl_lookup_symbol_skip (name, &ref, &_dl_loaded, NULL, l);
 	}
       else
 	{
diff --git a/elf/dlvsym.c b/elf/dlvsym.c
index 922a6eed1f..b3d4c1aeee 100644
--- a/elf/dlvsym.c
+++ b/elf/dlvsym.c
@@ -57,7 +57,7 @@ RTLD_NEXT used in code not dynamically loaded"));
 	    l = l->l_loader;
 
 	  loadbase = _dl_lookup_versioned_symbol_skip
-	    (name, &ref, &_dl_loaded, NULL, &version, l, 0);
+	    (name, &ref, &_dl_loaded, NULL, &version, l);
 	}
       else
 	{
diff --git a/elf/link.h b/elf/link.h
index 62bf74c23b..3934aed8e2 100644
--- a/elf/link.h
+++ b/elf/link.h
@@ -290,18 +290,15 @@ extern void _dl_close (struct link_map *map);
    null-terminated list of object scopes to search; each object's
    l_searchlist (i.e. the segment of the dependency tree starting at that
    object) is searched in turn.  REFERENCE_NAME should name the object
-   containing the reference; it is used in error messages.  FLAGS is a
-   set of flags:  */
-#define DL_LOOKUP_NOEXEC 1	/* Don't search the executable for a
-				   definition; this is used for copy
-				   relocs. */
-#define DL_LOOKUP_NOPLT 2	/* The reference must not be resolved
-				   to a PLT entry.  */
+   containing the reference; it is used in error messages.
+   RELOC_TYPE is a machine-dependent reloc type, which is passed to
+   the `elf_machine_lookup_*_p' macros in dl-machine.h to affect which
+   symbols can be chosen.  */
 extern ElfW(Addr) _dl_lookup_symbol (const char *undef,
 				     const ElfW(Sym) **sym,
 				     struct link_map *symbol_scope[],
 				     const char *reference_name,
-				     int flags);
+				     int reloc_type);
 
 /* Lookup versioned symbol.  */
 extern ElfW(Addr) _dl_lookup_versioned_symbol (const char *undef,
@@ -309,15 +306,14 @@ extern ElfW(Addr) _dl_lookup_versioned_symbol (const char *undef,
 					       struct link_map *symbol_scope[],
 					       const char *reference_name,
 					       const struct r_found_version *version,
-					       int flags);
+					       int reloc_type);
 
 /* For handling RTLD_NEXT we must be able to skip shared objects.  */
 extern ElfW(Addr) _dl_lookup_symbol_skip (const char *undef,
 					  const ElfW(Sym) **sym,
 					  struct link_map *symbol_scope[],
 					  const char *reference_name,
-					  struct link_map *skip_this,
-					  int flags);
+					  struct link_map *skip_this);
 
 /* For handling RTLD_NEXT with versioned symbols we must be able to
    skip shared objects.  */
@@ -326,8 +322,7 @@ extern ElfW(Addr) _dl_lookup_versioned_symbol_skip (const char *undef,
 						    struct link_map *symbol_scope[],
 						    const char *reference_name,
 						    const struct r_found_version *version,
-						    struct link_map *skip_this,
-						    int flags);
+						    struct link_map *skip_this);
 
 /* Look up symbol NAME in MAP's scope and return its run-time address.  */
 extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name);
diff --git a/elf/rtld.c b/elf/rtld.c
index 84ab37942b..295a6aed7d 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -518,7 +518,7 @@ of this helper program; chances are you did not intend to run this program.\n",
 	    ElfW(Addr) loadbase = _dl_lookup_symbol (_dl_argv[i], &ref,
 						     &_dl_default_scope[2],
 						     "argument",
-						     DL_LOOKUP_NOPLT);
+						     ELF_MACHINE_RELOC_NOPLT);
 	    char buf[20], *bp;
 	    buf[sizeof buf - 1] = '\0';
 	    bp = _itoa (ref->st_value, &buf[sizeof buf - 1], 16, 0);