Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 26 Aug 2001 22:28:16 +0000 (22:28 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 26 Aug 2001 22:28:16 +0000 (22:28 +0000)
2001-08-26  Jakub Jelinek  <jakub@redhat.com>

* elf/dl-reloc.c (RESOLVE_MAP, RESOLVE): Use elf_machine_type_class
instead of elf_machine_lookup_noexec_p and elf_machine_lookup_noplt_p.
Pass type_class to _dl_lookup_*.
* elf/dl-lookup.c (_dl_lookup_symbol): Take type_clas parameter now.
Pass around just type_class instead of noexec, noplt pair.
(_dl_lookup_versioned_symbol): Likewise.
(_dl_lookup_symbol_skip): Pass around just type_class instead of
noexec, noplt pair.
(_dl_lookup_versioned_symbol_skip): Likewise.
(_dl_do_lookup, _dl_do_lookup_versioned): Likewise.
* elf/do-lookup.h (do_lookup): Likewise.
* include/link.h (struct link_map): Replace noexec and noplt fields
in l_lookup_cache with type_class field.
* sysdeps/generic/ldsodefs.h (ELF_RTYPE_CLASS_PLT,
ELF_RTYPE_CLASS_COPY): Define.
Adjust prototypes for _dl_lookup_symbol and
_dl_lookup_versioned_symbol.
* sysdeps/alpha/dl-machine.h (elf_machine_lookup_noplt_p,
elf_machine_lookup_noexec_p): Remove.
(elf_machine_type_class): Define.
* sysdeps/arm/dl-machine.h: Likewise.
* sysdeps/hppa/dl-machine.h: Likewise.
* sysdeps/cris/dl-machine.h: Likewise.
* sysdeps/i386/dl-machine.h: Likewise.
* sysdeps/ia64/dl-machine.h: Likewise.
* sysdeps/m68k/dl-machine.h: Likewise.
* sysdeps/mips/mips64/dl-machine.h: Likewise.
* sysdeps/mips/dl-machine.h: Likewise.
* sysdeps/powerpc/dl-machine.h: Likewise.
* sysdeps/sparc/sparc32/dl-machine.h: Likewise.
* sysdeps/sparc/sparc64/dl-machine.h: Likewise.
* sysdeps/sh/dl-machine.h: Likewise.
* sysdeps/s390/s390-32/dl-machine.h: Likewise.
* sysdeps/s390/s390-64/dl-machine.h: Likewise.

21 files changed:
ChangeLog
elf/dl-lookup.c
elf/dl-reloc.c
elf/do-lookup.h
include/link.h
sysdeps/alpha/dl-machine.h
sysdeps/arm/dl-machine.h
sysdeps/cris/dl-machine.h
sysdeps/generic/ldsodefs.h
sysdeps/hppa/dl-machine.h
sysdeps/i386/dl-machine.h
sysdeps/ia64/dl-machine.h
sysdeps/m68k/dl-machine.h
sysdeps/mips/dl-machine.h
sysdeps/mips/mips64/dl-machine.h
sysdeps/powerpc/dl-machine.h
sysdeps/s390/s390-32/dl-machine.h
sysdeps/s390/s390-64/dl-machine.h
sysdeps/sh/dl-machine.h
sysdeps/sparc/sparc32/dl-machine.h
sysdeps/sparc/sparc64/dl-machine.h

index ed8c80f..35ba6a6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+2001-08-26  Jakub Jelinek  <jakub@redhat.com>
+
+       * elf/dl-reloc.c (RESOLVE_MAP, RESOLVE): Use elf_machine_type_class
+       instead of elf_machine_lookup_noexec_p and elf_machine_lookup_noplt_p.
+       Pass type_class to _dl_lookup_*.
+       * elf/dl-lookup.c (_dl_lookup_symbol): Take type_clas parameter now.
+       Pass around just type_class instead of noexec, noplt pair.
+       (_dl_lookup_versioned_symbol): Likewise.
+       (_dl_lookup_symbol_skip): Pass around just type_class instead of
+       noexec, noplt pair.
+       (_dl_lookup_versioned_symbol_skip): Likewise.
+       (_dl_do_lookup, _dl_do_lookup_versioned): Likewise.
+       * elf/do-lookup.h (do_lookup): Likewise.
+       * include/link.h (struct link_map): Replace noexec and noplt fields
+       in l_lookup_cache with type_class field.
+       * sysdeps/generic/ldsodefs.h (ELF_RTYPE_CLASS_PLT,
+       ELF_RTYPE_CLASS_COPY): Define.
+       Adjust prototypes for _dl_lookup_symbol and
+       _dl_lookup_versioned_symbol.
+       * sysdeps/alpha/dl-machine.h (elf_machine_lookup_noplt_p,
+       elf_machine_lookup_noexec_p): Remove.
+       (elf_machine_type_class): Define.
+       * sysdeps/arm/dl-machine.h: Likewise.
+       * sysdeps/hppa/dl-machine.h: Likewise.
+       * sysdeps/cris/dl-machine.h: Likewise.
+       * sysdeps/i386/dl-machine.h: Likewise.
+       * sysdeps/ia64/dl-machine.h: Likewise.
+       * sysdeps/m68k/dl-machine.h: Likewise.
+       * sysdeps/mips/mips64/dl-machine.h: Likewise.
+       * sysdeps/mips/dl-machine.h: Likewise.
+       * sysdeps/powerpc/dl-machine.h: Likewise.
+       * sysdeps/sparc/sparc32/dl-machine.h: Likewise.
+       * sysdeps/sparc/sparc64/dl-machine.h: Likewise.
+       * sysdeps/sh/dl-machine.h: Likewise.
+       * sysdeps/s390/s390-32/dl-machine.h: Likewise.
+       * sysdeps/s390/s390-64/dl-machine.h: Likewise.
+
 2001-08-26  Ulrich Drepper  <drepper@redhat.com>
 
        * manual/message.texi (Advanced gettext functions): Change
index 71dda25..5fa6b73 100644 (file)
@@ -175,14 +175,14 @@ internal_function
 _dl_do_lookup (const char *undef_name, unsigned long int hash,
               const ElfW(Sym) *ref, struct sym_val *result,
               struct r_scope_elem *scope, size_t i,
-              struct link_map *skip, int noexec, int noplt);
+              struct link_map *skip, int type_class);
 static int
 internal_function
 _dl_do_lookup_versioned (const char *undef_name, unsigned long int hash,
                         const ElfW(Sym) *ref, struct sym_val *result,
                         struct r_scope_elem *scope, size_t i,
                         const struct r_found_version *const version,
-                        struct link_map *skip, int noexec, int noplt);
+                        struct link_map *skip, int type_class);
 
 
 /* Search loaded objects' symbol tables for a definition of the symbol
@@ -192,21 +192,19 @@ lookup_t
 internal_function
 _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
                   const ElfW(Sym) **ref, struct r_scope_elem *symbol_scope[],
-                  int reloc_type, int explicit)
+                  int type_class, int explicit)
 {
   unsigned long int hash = _dl_elf_hash (undef_name);
   struct sym_val current_value = { NULL, NULL };
   struct r_scope_elem **scope;
   int protected;
-  int noexec = elf_machine_lookup_noexec_p (reloc_type);
-  int noplt = elf_machine_lookup_noplt_p (reloc_type);
 
   ++_dl_num_relocations;
 
   /* Search the relevant loaded objects for a definition.  */
   for (scope = symbol_scope; *scope; ++scope)
     if (do_lookup (undef_name, hash, *ref, &current_value, *scope, 0, NULL,
-                  noexec, noplt))
+                  type_class))
       {
        /* We have to check whether this would bind UNDEF_MAP to an object
           in the global scope which was dynamically loaded.  In this case
@@ -223,7 +221,7 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
          /* Something went wrong.  Perhaps the object we tried to reference
             was just removed.  Try finding another definition.  */
          return _dl_lookup_symbol (undef_name, undef_map, ref, symbol_scope,
-                                   reloc_type, 0);
+                                   type_class, 0);
 
        break;
       }
@@ -270,7 +268,7 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
 
       for (scope = symbol_scope; *scope; ++scope)
        if (_dl_do_lookup (undef_name, hash, *ref, &protected_value, *scope,
-                          0, NULL, 0, 1))
+                          0, NULL, ELF_RTYPE_CLASS_PLT))
          break;
 
       if (protected_value.s == NULL || protected_value.m == undef_map)
@@ -311,10 +309,10 @@ _dl_lookup_symbol_skip (const char *undef_name,
     assert (i < (*scope)->r_nlist);
 
   if (! _dl_do_lookup (undef_name, hash, *ref, &current_value, *scope, i,
-                      skip_map, 0, 0))
+                      skip_map, 0))
     while (*++scope)
       if (_dl_do_lookup (undef_name, hash, *ref, &current_value, *scope, 0,
-                        skip_map, 0, 0))
+                        skip_map, 0))
        break;
 
   if (__builtin_expect (current_value.s == NULL, 0))
@@ -346,10 +344,10 @@ _dl_lookup_symbol_skip (const char *undef_name,
 
       if (i >= (*scope)->r_nlist
          || !_dl_do_lookup (undef_name, hash, *ref, &protected_value, *scope,
-                            i, skip_map, 0, 1))
+                            i, skip_map, ELF_RTYPE_CLASS_PLT))
        while (*++scope)
          if (_dl_do_lookup (undef_name, hash, *ref, &protected_value, *scope,
-                            0, skip_map, 0, 1))
+                            0, skip_map, ELF_RTYPE_CLASS_PLT))
            break;
 
       if (protected_value.s == NULL || protected_value.m == undef_map)
@@ -374,14 +372,12 @@ _dl_lookup_versioned_symbol (const char *undef_name,
                             struct link_map *undef_map, const ElfW(Sym) **ref,
                             struct r_scope_elem *symbol_scope[],
                             const struct r_found_version *version,
-                            int reloc_type, int explicit)
+                            int type_class, int explicit)
 {
   unsigned long int hash = _dl_elf_hash (undef_name);
   struct sym_val current_value = { NULL, NULL };
   struct r_scope_elem **scope;
   int protected;
-  int noexec = elf_machine_lookup_noexec_p (reloc_type);
-  int noplt = elf_machine_lookup_noplt_p (reloc_type);
 
   ++_dl_num_relocations;
 
@@ -389,7 +385,7 @@ _dl_lookup_versioned_symbol (const char *undef_name,
   for (scope = symbol_scope; *scope; ++scope)
     {
       int res = do_lookup_versioned (undef_name, hash, *ref, &current_value,
-                                    *scope, 0, version, NULL, noexec, noplt);
+                                    *scope, 0, version, NULL, type_class);
       if (res > 0)
        {
          /* We have to check whether this would bind UNDEF_MAP to an object
@@ -408,7 +404,7 @@ _dl_lookup_versioned_symbol (const char *undef_name,
               was just removed.  Try finding another definition.  */
            return _dl_lookup_versioned_symbol (undef_name, undef_map, ref,
                                                symbol_scope, version,
-                                               reloc_type, 0);
+                                               type_class, 0);
 
          break;
        }
@@ -482,7 +478,8 @@ _dl_lookup_versioned_symbol (const char *undef_name,
 
       for (scope = symbol_scope; *scope; ++scope)
        if (_dl_do_lookup_versioned (undef_name, hash, *ref, &protected_value,
-                                    *scope, 0, version, NULL, 0, 1))
+                                    *scope, 0, version, NULL,
+                                    ELF_RTYPE_CLASS_PLT))
          break;
 
       if (protected_value.s == NULL || protected_value.m == undef_map)
@@ -522,10 +519,10 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
     assert (i < (*scope)->r_nlist);
 
   if (! _dl_do_lookup_versioned (undef_name, hash, *ref, &current_value,
-                                *scope, i, version, skip_map, 0, 0))
+                                *scope, i, version, skip_map, 0))
     while (*++scope)
       if (_dl_do_lookup_versioned (undef_name, hash, *ref, &current_value,
-                                  *scope, 0, version, skip_map, 0, 0))
+                                  *scope, 0, version, skip_map, 0))
        break;
 
   if (__builtin_expect (current_value.s == NULL, 0))
@@ -571,11 +568,11 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
       if (i >= (*scope)->r_nlist
          || !_dl_do_lookup_versioned (undef_name, hash, *ref,
                                       &protected_value, *scope, i, version,
-                                      skip_map, 0, 1))
+                                      skip_map, ELF_RTYPE_CLASS_PLT))
        while (*++scope)
          if (_dl_do_lookup_versioned (undef_name, hash, *ref,
                                       &protected_value, *scope, 0, version,
-                                      skip_map, 0, 1))
+                                      skip_map, ELF_RTYPE_CLASS_PLT))
            break;
 
       if (protected_value.s == NULL || protected_value.m == undef_map)
@@ -616,10 +613,10 @@ internal_function
 _dl_do_lookup (const char *undef_name, unsigned long int hash,
               const ElfW(Sym) *ref, struct sym_val *result,
               struct r_scope_elem *scope, size_t i,
-              struct link_map *skip, int noexec, int noplt)
+              struct link_map *skip, int type_class)
 {
-  return do_lookup (undef_name, hash, ref, result, scope, i, skip, noexec,
-                   noplt);
+  return do_lookup (undef_name, hash, ref, result, scope, i, skip,
+                   type_class);
 }
 
 static int
@@ -628,8 +625,8 @@ _dl_do_lookup_versioned (const char *undef_name, unsigned long int hash,
                         const ElfW(Sym) *ref, struct sym_val *result,
                         struct r_scope_elem *scope, size_t i,
                         const struct r_found_version *const version,
-                        struct link_map *skip, int noexec, int noplt)
+                        struct link_map *skip, int type_class)
 {
   return do_lookup_versioned (undef_name, hash, ref, result, scope, i,
-                             version, skip, noexec, noplt);
+                             version, skip, type_class);
 }
index 276aea0..6e38648 100644 (file)
@@ -75,45 +75,43 @@ cannot make segment writable for relocation"));
     const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
 
     /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
-#define RESOLVE_MAP(ref, version, flags) \
+#define RESOLVE_MAP(ref, version, r_type) \
     (ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL                            \
      ? ((__builtin_expect ((*ref) == l->l_lookup_cache.sym, 0)               \
-        && elf_machine_lookup_noexec_p (flags) == l->l_lookup_cache.noexec   \
-        && elf_machine_lookup_noplt_p (flags) == l->l_lookup_cache.noplt)    \
+        && elf_machine_type_class (r_type) == l->l_lookup_cache.type_class)  \
        ? (++_dl_num_cache_relocations,                                       \
           (*ref) = l->l_lookup_cache.ret,                                    \
           l->l_lookup_cache.value)                                           \
        : ({ lookup_t _lr;                                                    \
+            int _tc = elf_machine_type_class (r_type);                       \
+            l->l_lookup_cache.type_class = _tc;                              \
             l->l_lookup_cache.sym = (*ref);                                  \
-            l->l_lookup_cache.noexec = elf_machine_lookup_noexec_p (flags);  \
-            l->l_lookup_cache.noplt = elf_machine_lookup_noplt_p (flags);    \
             _lr = ((version) != NULL && (version)->hash != 0                 \
                    ? _dl_lookup_versioned_symbol (strtab + (*ref)->st_name,  \
                                                   l, (ref), scope,           \
-                                                  (version), (flags), 0)     \
+                                                  (version), _tc, 0)         \
                    : _dl_lookup_symbol (strtab + (*ref)->st_name, l, (ref),  \
-                                        scope, (flags), 0));                 \
+                                        scope, _tc, 0));                     \
             l->l_lookup_cache.ret = (*ref);                                  \
             l->l_lookup_cache.value = _lr; }))                               \
      : l)
-#define RESOLVE(ref, version, flags) \
+#define RESOLVE(ref, version, r_type) \
     (ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL                            \
      ? ((__builtin_expect ((*ref) == l->l_lookup_cache.sym, 0)               \
-        && elf_machine_lookup_noexec_p (flags) == l->l_lookup_cache.noexec   \
-        && elf_machine_lookup_noplt_p (flags) == l->l_lookup_cache.noplt)    \
+        && elf_machine_type_class (r_type) == l->l_lookup_cache.type_class)  \
        ? (++_dl_num_cache_relocations,                                       \
           (*ref) = l->l_lookup_cache.ret,                                    \
           l->l_lookup_cache.value)                                           \
        : ({ lookup_t _lr;                                                    \
+            int _tc = elf_machine_type_class (r_type);                       \
+            l->l_lookup_cache.type_class = _tc;                              \
             l->l_lookup_cache.sym = (*ref);                                  \
-            l->l_lookup_cache.noexec = elf_machine_lookup_noexec_p (flags);  \
-            l->l_lookup_cache.noplt = elf_machine_lookup_noplt_p (flags);    \
             _lr = ((version) != NULL && (version)->hash != 0                 \
                    ? _dl_lookup_versioned_symbol (strtab + (*ref)->st_name,  \
                                                   l, (ref), scope,           \
-                                                  (version), (flags), 0)     \
+                                                  (version), _tc, 0)         \
                    : _dl_lookup_symbol (strtab + (*ref)->st_name, l, (ref),  \
-                                        scope, (flags), 0));                 \
+                                        scope, _tc, 0));                     \
             l->l_lookup_cache.ret = (*ref);                                  \
             l->l_lookup_cache.value = _lr; }))                               \
      : l->l_addr)
index e60e227..b9364b9 100644 (file)
@@ -31,7 +31,7 @@
 static inline int
 FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref,
      struct sym_val *result, struct r_scope_elem *scope, size_t i, ARG
-     struct link_map *skip, int noexec, int noplt)
+     struct link_map *skip, int type_class)
 {
   struct link_map **list = scope->r_list;
   size_t n = scope->r_nlist;
@@ -56,7 +56,7 @@ FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref,
        continue;
 
       /* Don't search the executable when resolving a copy reloc.  */
-      if (noexec && map->l_type == lt_executable)
+      if ((type_class & ELF_RTYPE_CLASS_COPY) && map->l_type == lt_executable)
        continue;
 
       /* Print some debugging info if wanted.  */
@@ -76,8 +76,11 @@ FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref,
        {
          sym = &symtab[symidx];
 
+         assert (ELF_RTYPE_CLASS_PLT == 1);
          if (sym->st_value == 0 || /* No value.  */
-             (noplt && sym->st_shndx == SHN_UNDEF))
+             /* ((type_class & ELF_RTYPE_CLASS_PLT)
+                 && (sym->st_shndx == SHN_UNDEF)) */
+             (type_class & (sym->st_shndx == SHN_UNDEF)))
            continue;
 
          if (ELFW(ST_TYPE) (sym->st_info) > STT_FUNC)
index 5aba874..0ae0526 100644 (file)
@@ -236,8 +236,7 @@ struct link_map
     struct
     {
       const ElfW(Sym) *sym;
-      int noexec;
-      int noplt;
+      int type_class;
 #ifdef DL_LOOKUP_RETURNS_MAP
       struct link_map *value;
 #else
index 37e8136..64cca5c 100644 (file)
@@ -351,13 +351,13 @@ $fixup_stack:
 #define RTLD_START_SPECIAL_INIT /* nothing */
 #endif
 
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type)  ((type) == R_ALPHA_JMP_SLOT)
-
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc, which we don't use.  */
-#define elf_machine_lookup_noexec_p(type)  (0)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc, which we don't
+   use.  */
+#define elf_machine_type_class(type)   \
+  (((type) == R_ALPHA_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT    R_ALPHA_JMP_SLOT
index 7dfed99..2a4ce9f 100644 (file)
@@ -323,13 +323,13 @@ _dl_start_user:
 .previous\n\
 ");
 
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_ARM_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_ARM_JUMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_ARM_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
+   | (((type) == R_ARM_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_ARM_JUMP_SLOT
index ce8dfc6..e4778e3 100644 (file)
@@ -228,13 +228,13 @@ _dl_start_user:
        .size _dl_start_user, . - _dl_start_user
        .previous");
 
-/* Nonzero iff TYPE describes a relocation that should
-   skip the executable when looking up the symbol value.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_CRIS_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_CRIS_JUMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_CRIS_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT)        \
+   | (((type) == R_CRIS_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_CRIS_JUMP_SLOT
index 6d196c7..5947381 100644 (file)
@@ -88,6 +88,13 @@ typedef ElfW(Addr) lookup_t;
 # define DL_STATIC_INIT(map)
 #endif
 
+/* Reloc type classes as returned by elf_machine_type_class().
+   ELF_RTYPE_CLASS_PLT means this reloc should not be satisfied by
+   some PLT symbol, ELF_RTYPE_CLASS_COPY means this reloc should not be
+   satisfied by any symbol in the executable.  */
+#define ELF_RTYPE_CLASS_PLT 1
+#define ELF_RTYPE_CLASS_COPY 2
+
 /* For the version handling we need an array with only names and their
    hash values.  */
 struct r_found_version
@@ -336,14 +343,12 @@ extern void _dl_setup_hash (struct link_map *map) internal_function;
    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.
-   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.  */
+   TYPE_CLASS describes the type of symbol we are looking for.  */
 extern lookup_t _dl_lookup_symbol (const char *undef,
                                   struct link_map *undef_map,
                                   const ElfW(Sym) **sym,
                                   struct r_scope_elem *symbol_scope[],
-                                  int reloc_type, int explicit)
+                                  int type_class, int explicit)
      internal_function;
 
 /* Lookup versioned symbol.  */
@@ -352,7 +357,7 @@ extern lookup_t _dl_lookup_versioned_symbol (const char *undef,
                                             const ElfW(Sym) **sym,
                                             struct r_scope_elem *symbol_scope[],
                                             const struct r_found_version *version,
-                                            int reloc_type, int explicit)
+                                            int type_class, int explicit)
      internal_function;
 
 /* For handling RTLD_NEXT we must be able to skip shared objects.  */
index 15e1c85..d13f15b 100644 (file)
@@ -454,14 +454,14 @@ asm (                                                                     \
 #endif
 
 
-/* Nonzero iff TYPE describes a relocation that should
-   skip the executable when looking up the symbol value.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_PARISC_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_PARISC_IPLT \
-                                         || (type) == R_PARISC_EPLT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_PARISC_IPLT || (type) == R_PARISC_EPLT)       \
+    * ELF_RTYPE_CLASS_PLT)                                     \
+   | (((type) == R_PARISC_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* Used by ld.so for ... something ... */
 #define ELF_MACHINE_JMP_SLOT R_PARISC_IPLT
index e7a1b10..bb3e89c 100644 (file)
@@ -247,13 +247,13 @@ _dl_start_user:\n\
 #define RTLD_START_SPECIAL_INIT /* nothing */
 #endif
 
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_386_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_386_JMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_386_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)  \
+   | (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_386_JMP_SLOT
@@ -371,8 +371,6 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
                                                   refsym->st_size));
          break;
        default:
-         /* We add these checks in the version to relocate ld.so only
-            if we are still debugging.  */
          _dl_reloc_bad_type (map, r_type, 0);
          break;
        }
index 99c022d..21e5615 100644 (file)
@@ -434,14 +434,14 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 #define RTLD_START_SPECIAL_INIT /* nothing */
 #endif
 
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc, which we don't
+   use.  */
 /* ??? Ignore IPLTMSB for now.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_IA64_IPLTLSB)
-
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc, which we don't use.  */
-#define elf_machine_lookup_noexec_p(type)  (0)
+#define elf_machine_type_class(type) \
+  (((type) == R_IA64_IPLTLSB) * ELF_RTYPE_CLASS_PLT)
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT    R_IA64_IPLTLSB
index b0e2927..d9c8194 100644 (file)
@@ -189,13 +189,13 @@ _dl_start_user:
        .size _dl_start_user, . - _dl_start_user
        .previous");
 
-/* Nonzero iff TYPE describes a relocation that should
-   skip the executable when looking up the symbol value.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_68K_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_68K_JMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_68K_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)  \
+   | (((type) == R_68K_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_68K_JMP_SLOT
index 878e27d..cb3fc1c 100644 (file)
@@ -54,8 +54,7 @@
    This makes no sense on MIPS but we have to define this to R_MIPS_REL32
    to avoid the asserts in dl-lookup.c from blowing.  */
 #define ELF_MACHINE_JMP_SLOT                   R_MIPS_REL32
-#define elf_machine_lookup_noplt_p(type)       (1)
-#define elf_machine_lookup_noexec_p(type)      (0)
+#define elf_machine_type_class(type)           ELF_RTYPE_CLASS_PLT
 
 /* Translate a processor specific dynamic tag to the index
    in l_info array.  */
index eda94c2..34a8161 100644 (file)
@@ -45,8 +45,7 @@
    This makes no sense on MIPS but we have to define this to R_MIPS_REL32
    to avoid the asserts in dl-lookup.c from blowing.  */
 #define ELF_MACHINE_JMP_SLOT                   R_MIPS_REL32
-#define elf_machine_lookup_noplt_p(type)       (1)
-#define elf_machine_lookup_noexec_p(type)      (0)
+#define elf_machine_type_class(type)           ELF_RTYPE_CLASS_PLT
 
 /* Translate a processor specific dynamic tag to the index
    in l_info array.  */
index 438629a..e8b5446 100644 (file)
@@ -264,18 +264,18 @@ __elf_preferred_address(struct link_map *loader, size_t maplength,
 #define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) \
   __elf_preferred_address (loader, maplength, mapstartpref)
 
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_PPC_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
 /* We never want to use a PLT entry as the destination of a
    reloc, when what is being relocated is a branch. This is
    partly for efficiency, but mostly so we avoid loops.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_PPC_REL24 ||            \
-                                         (type) == R_PPC_ADDR24 ||           \
-                                         (type) == R_PPC_JMP_SLOT)
+#define elf_machine_type_class(type) \
+  ((((type) == R_PPC_JMP_SLOT                          \
+    || (type) == R_PPC_REL24                           \
+    || (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT)  \
+   | (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_PPC_JMP_SLOT
index 8028f62..f72651f 100644 (file)
@@ -304,13 +304,13 @@ _dl_start_user:\n\
 #define RTLD_START_SPECIAL_INIT /* nothing */
 #endif
 
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_390_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_390_JMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_390_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)  \
+   | (((type) == R_390_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT    R_390_JMP_SLOT
index dde72f1..e77017a 100644 (file)
@@ -276,13 +276,13 @@ _dl_start_user:\n\
 #define RTLD_START_SPECIAL_INIT /* nothing */
 #endif
 
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc. */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_390_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_390_JMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_390_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)  \
+   | (((type) == R_390_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_390_JMP_SLOT
index 6f3b31c..ee5bb9c 100644 (file)
@@ -388,13 +388,13 @@ _dl_start_user:\n\
 .previous\n\
 ");
 
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc. */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_SH_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_SH_JMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_SH_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)   \
+   | (((type) == R_SH_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_SH_JMP_SLOT
index 2ed14fc..8c36987 100644 (file)
@@ -177,13 +177,13 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
   TRAMPOLINE_TEMPLATE (_dl_runtime_profile, fixup);
 #endif
 
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)        \
+   | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_SPARC_JMP_SLOT
index a72cb89..431e38b 100644 (file)
@@ -392,13 +392,13 @@ elf_machine_lazy_rel (struct link_map *map,
 
 #endif /* RESOLVE */
 
-/* Nonzero iff TYPE should not be allowed to resolve to one of
-   the main executable's symbols, as for a COPY reloc.  */
-#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY)
-
-/* Nonzero iff TYPE describes relocation of a PLT entry, so
-   PLT entries should not be allowed to define the value.  */
-#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT)
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+   PLT entries should not be allowed to define the value.
+   ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+   of the main executable's symbols, as for a COPY reloc.  */
+#define elf_machine_type_class(type) \
+  ((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT)        \
+   | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_SPARC_JMP_SLOT