[5/5] i386: Remove RELA support

Message ID 20220802145905.2789733-6-adhemerval.zanella@linaro.org
State Committed
Commit 3698f5a9dd4b98b3d88f61fceae8b6bb39c7db2b
Headers
Series More features cleanups |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

Adhemerval Zanella Netto Aug. 2, 2022, 2:59 p.m. UTC
  Now that prelink is not support, there is no need to keep supporting
rela for non bootstrap.
---
 sysdeps/i386/dl-machine-rel.h |   7 +-
 sysdeps/i386/dl-machine.h     | 191 ----------------------------------
 2 files changed, 1 insertion(+), 197 deletions(-)
  

Comments

H.J. Lu Aug. 2, 2022, 3:13 p.m. UTC | #1
On Tue, Aug 2, 2022 at 8:02 AM Adhemerval Zanella via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> Now that prelink is not support, there is no need to keep supporting
> rela for non bootstrap.
> ---
>  sysdeps/i386/dl-machine-rel.h |   7 +-
>  sysdeps/i386/dl-machine.h     | 191 ----------------------------------
>  2 files changed, 1 insertion(+), 197 deletions(-)
>
> diff --git a/sysdeps/i386/dl-machine-rel.h b/sysdeps/i386/dl-machine-rel.h
> index b98273aead..9dfaf718f2 100644
> --- a/sysdeps/i386/dl-machine-rel.h
> +++ b/sysdeps/i386/dl-machine-rel.h
> @@ -19,13 +19,8 @@
>  #ifndef _DL_MACHINE_REL_H
>  #define _DL_MACHINE_REL_H
>
> -/* The i386 never uses Elf32_Rela relocations for the dynamic linker.
> -   Prelinked libraries may use Elf32_Rela though.  */
> -#define ELF_MACHINE_NO_RELA defined RTLD_BOOTSTRAP
> +#define ELF_MACHINE_NO_RELA 1
>  #define ELF_MACHINE_NO_REL 0
> -
> -/* The i386 never uses Elf32_Rela relocations for the dynamic linker.
> -   Prelinked libraries may use Elf32_Rela though.  */
>  #define ELF_MACHINE_PLT_REL 1
>
>  #define PLTREL ElfW(Rel)
> diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
> index 56a189fda2..64aad6e787 100644
> --- a/sysdeps/i386/dl-machine.h
> +++ b/sysdeps/i386/dl-machine.h
> @@ -437,153 +437,6 @@ and creates an unsatisfiable circular dependency.\n",
>      }
>  }
>
> -# ifndef RTLD_BOOTSTRAP
> -static inline void
> -__attribute__ ((always_inline))
> -elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
> -                 const Elf32_Rela *reloc, const Elf32_Sym *sym,
> -                 const struct r_found_version *version,
> -                 void *const reloc_addr_arg, int skip_ifunc)
> -{
> -  Elf32_Addr *const reloc_addr = reloc_addr_arg;
> -  const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
> -
> -  if (ELF32_R_TYPE (reloc->r_info) == R_386_RELATIVE)
> -    *reloc_addr = map->l_addr + reloc->r_addend;
> -  else if (r_type != R_386_NONE)
> -    {
> -      const Elf32_Sym *const refsym = sym;
> -      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
> -                                             r_type);
> -      Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
> -
> -      if (sym != NULL
> -         && __glibc_likely (sym->st_shndx != SHN_UNDEF)
> -         && __glibc_unlikely (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC)
> -         && __glibc_likely (!skip_ifunc))
> -       value = ((Elf32_Addr (*) (void)) value) ();
> -
> -      switch (ELF32_R_TYPE (reloc->r_info))
> -       {
> -       case R_386_SIZE32:
> -         /* Set to symbol size plus addend.  */
> -         value = sym->st_size;
> -         /* Fall through.  */
> -       case R_386_GLOB_DAT:
> -       case R_386_JMP_SLOT:
> -       case R_386_32:
> -         *reloc_addr = value + reloc->r_addend;
> -         break;
> -         /* Not needed for dl-conflict.c.  */
> -       case R_386_PC32:
> -         *reloc_addr = (value + reloc->r_addend - (Elf32_Addr) reloc_addr);
> -         break;
> -
> -       case R_386_TLS_DTPMOD32:
> -         /* Get the information from the link map returned by the
> -            resolv function.  */
> -         if (sym_map != NULL)
> -           *reloc_addr = sym_map->l_tls_modid;
> -         break;
> -       case R_386_TLS_DTPOFF32:
> -         /* During relocation all TLS symbols are defined and used.
> -            Therefore the offset is already correct.  */
> -         *reloc_addr = (sym == NULL ? 0 : sym->st_value) + reloc->r_addend;
> -         break;
> -       case R_386_TLS_DESC:
> -         {
> -           struct tlsdesc volatile *td =
> -             (struct tlsdesc volatile *)reloc_addr;
> -
> -#  ifndef RTLD_BOOTSTRAP
> -           if (!sym)
> -             {
> -               td->arg = (void*)reloc->r_addend;
> -               td->entry = _dl_tlsdesc_undefweak;
> -             }
> -           else
> -#  endif
> -             {
> -#  ifndef RTLD_BOOTSTRAP
> -#   ifndef SHARED
> -               CHECK_STATIC_TLS (map, sym_map);
> -#   else
> -               if (!TRY_STATIC_TLS (map, sym_map))
> -                 {
> -                   td->arg = _dl_make_tlsdesc_dynamic
> -                     (sym_map, sym->st_value + reloc->r_addend);
> -                   td->entry = _dl_tlsdesc_dynamic;
> -                 }
> -               else
> -#   endif
> -#  endif
> -                 {
> -                   td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
> -                                     + reloc->r_addend);
> -                   td->entry = _dl_tlsdesc_return;
> -                 }
> -             }
> -         }
> -         break;
> -       case R_386_TLS_TPOFF32:
> -         /* The offset is positive, backward from the thread pointer.  */
> -         /* We know the offset of object the symbol is contained in.
> -            It is a positive value which will be subtracted from the
> -            thread pointer.  To get the variable position in the TLS
> -            block we subtract the offset from that of the TLS block.  */
> -         if (sym != NULL)
> -           {
> -             CHECK_STATIC_TLS (map, sym_map);
> -             *reloc_addr = sym_map->l_tls_offset - sym->st_value
> -                           + reloc->r_addend;
> -           }
> -         break;
> -       case R_386_TLS_TPOFF:
> -         /* The offset is negative, forward from the thread pointer.  */
> -         /* We know the offset of object the symbol is contained in.
> -            It is a negative value which will be added to the
> -            thread pointer.  */
> -         if (sym != NULL)
> -           {
> -             CHECK_STATIC_TLS (map, sym_map);
> -             *reloc_addr = sym->st_value - sym_map->l_tls_offset
> -                           + reloc->r_addend;
> -           }
> -         break;
> -       case R_386_COPY:
> -         if (sym == NULL)
> -           /* This can happen in trace mode if an object could not be
> -              found.  */
> -           break;
> -         if (__glibc_unlikely (sym->st_size > refsym->st_size)
> -             || (__glibc_unlikely (sym->st_size < refsym->st_size)
> -                 && GLRO(dl_verbose)))
> -           {
> -             const char *strtab;
> -
> -             strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
> -             _dl_error_printf ("\
> -%s: Symbol `%s' has different size in shared object, consider re-linking\n",
> -                               RTLD_PROGNAME, strtab + refsym->st_name);
> -           }
> -         memcpy (reloc_addr_arg, (void *) value,
> -                 MIN (sym->st_size, refsym->st_size));
> -         break;
> -       case R_386_IRELATIVE:
> -         value = map->l_addr + reloc->r_addend;
> -         if (__glibc_likely (!skip_ifunc))
> -           value = ((Elf32_Addr (*) (void)) value) ();
> -         *reloc_addr = value;
> -         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;
> -       }
> -    }
> -}
> -# endif        /* !RTLD_BOOTSTRAP */
>
>  static inline void
>  __attribute ((always_inline))
> @@ -664,48 +517,4 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
>      _dl_reloc_bad_type (map, r_type, 1);
>  }
>
> -# ifndef RTLD_BOOTSTRAP
> -
> -static inline void
> -__attribute__ ((always_inline))
> -elf_machine_lazy_rela (struct link_map *map, struct r_scope_elem *scope[],
> -                      Elf32_Addr l_addr, const Elf32_Rela *reloc,
> -                      int skip_ifunc)
> -{
> -  Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
> -  const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
> -  if (__glibc_likely (r_type == R_386_JMP_SLOT))
> -    ;
> -  else if (__glibc_likely (r_type == R_386_TLS_DESC))
> -    {
> -      const Elf_Symndx symndx = ELFW (R_SYM) (reloc->r_info);
> -      const ElfW (Sym) *symtab = (const void *)D_PTR (map, l_info[DT_SYMTAB]);
> -      const ElfW (Sym) *sym = &symtab[symndx];
> -      const struct r_found_version *version = NULL;
> -
> -      if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
> -       {
> -         const ElfW (Half) *vernum =
> -           (const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
> -         version = &map->l_versions[vernum[symndx] & 0x7fff];
> -       }
> -
> -      /* Always initialize TLS descriptors completely at load time, in
> -        case static TLS is allocated for it that requires locking.  */
> -      elf_machine_rela (map, scope, reloc, sym, version, reloc_addr,
> -                       skip_ifunc);
> -    }
> -  else if (__glibc_unlikely (r_type == R_386_IRELATIVE))
> -    {
> -      Elf32_Addr value = map->l_addr + reloc->r_addend;
> -      if (__glibc_likely (!skip_ifunc))
> -       value = ((Elf32_Addr (*) (void)) value) ();
> -      *reloc_addr = value;
> -    }
> -  else
> -    _dl_reloc_bad_type (map, r_type, 1);
> -}
> -
> -# endif        /* !RTLD_BOOTSTRAP */
> -
>  #endif /* RESOLVE_MAP */
> --
> 2.34.1
>

LGTM.

Thanks.
  
Fangrui Song Aug. 4, 2022, 12:45 a.m. UTC | #2
On 2022-08-02, H.J. Lu via Libc-alpha wrote:
>On Tue, Aug 2, 2022 at 8:02 AM Adhemerval Zanella via Libc-alpha
><libc-alpha@sourceware.org> wrote:
>>
>> Now that prelink is not support, there is no need to keep supporting
>> rela for non bootstrap.
>> ---
>>  sysdeps/i386/dl-machine-rel.h |   7 +-
>>  sysdeps/i386/dl-machine.h     | 191 ----------------------------------
>>  2 files changed, 1 insertion(+), 197 deletions(-)

Thanks for cleaning up RELA on REL-dominant architectures.
Note that there is some value in using REL on RELA-dominant
architectures as REL for dynamic relocations can decrease code size.

ld.lld -z rel produces .rel.dyn for RELA-dominant architectures.
  

Patch

diff --git a/sysdeps/i386/dl-machine-rel.h b/sysdeps/i386/dl-machine-rel.h
index b98273aead..9dfaf718f2 100644
--- a/sysdeps/i386/dl-machine-rel.h
+++ b/sysdeps/i386/dl-machine-rel.h
@@ -19,13 +19,8 @@ 
 #ifndef _DL_MACHINE_REL_H
 #define _DL_MACHINE_REL_H
 
-/* The i386 never uses Elf32_Rela relocations for the dynamic linker.
-   Prelinked libraries may use Elf32_Rela though.  */
-#define ELF_MACHINE_NO_RELA defined RTLD_BOOTSTRAP
+#define ELF_MACHINE_NO_RELA 1
 #define ELF_MACHINE_NO_REL 0
-
-/* The i386 never uses Elf32_Rela relocations for the dynamic linker.
-   Prelinked libraries may use Elf32_Rela though.  */
 #define ELF_MACHINE_PLT_REL 1
 
 #define PLTREL ElfW(Rel)
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index 56a189fda2..64aad6e787 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -437,153 +437,6 @@  and creates an unsatisfiable circular dependency.\n",
     }
 }
 
-# ifndef RTLD_BOOTSTRAP
-static inline void
-__attribute__ ((always_inline))
-elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
-		  const Elf32_Rela *reloc, const Elf32_Sym *sym,
-		  const struct r_found_version *version,
-		  void *const reloc_addr_arg, int skip_ifunc)
-{
-  Elf32_Addr *const reloc_addr = reloc_addr_arg;
-  const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
-
-  if (ELF32_R_TYPE (reloc->r_info) == R_386_RELATIVE)
-    *reloc_addr = map->l_addr + reloc->r_addend;
-  else if (r_type != R_386_NONE)
-    {
-      const Elf32_Sym *const refsym = sym;
-      struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
-					      r_type);
-      Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
-
-      if (sym != NULL
-	  && __glibc_likely (sym->st_shndx != SHN_UNDEF)
-	  && __glibc_unlikely (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC)
-	  && __glibc_likely (!skip_ifunc))
-	value = ((Elf32_Addr (*) (void)) value) ();
-
-      switch (ELF32_R_TYPE (reloc->r_info))
-	{
-	case R_386_SIZE32:
-	  /* Set to symbol size plus addend.  */
-	  value = sym->st_size;
-	  /* Fall through.  */
-	case R_386_GLOB_DAT:
-	case R_386_JMP_SLOT:
-	case R_386_32:
-	  *reloc_addr = value + reloc->r_addend;
-	  break;
-	  /* Not needed for dl-conflict.c.  */
-	case R_386_PC32:
-	  *reloc_addr = (value + reloc->r_addend - (Elf32_Addr) reloc_addr);
-	  break;
-
-	case R_386_TLS_DTPMOD32:
-	  /* Get the information from the link map returned by the
-	     resolv function.  */
-	  if (sym_map != NULL)
-	    *reloc_addr = sym_map->l_tls_modid;
-	  break;
-	case R_386_TLS_DTPOFF32:
-	  /* During relocation all TLS symbols are defined and used.
-	     Therefore the offset is already correct.  */
-	  *reloc_addr = (sym == NULL ? 0 : sym->st_value) + reloc->r_addend;
-	  break;
-	case R_386_TLS_DESC:
-	  {
-	    struct tlsdesc volatile *td =
-	      (struct tlsdesc volatile *)reloc_addr;
-
-#  ifndef RTLD_BOOTSTRAP
-	    if (!sym)
-	      {
-		td->arg = (void*)reloc->r_addend;
-		td->entry = _dl_tlsdesc_undefweak;
-	      }
-	    else
-#  endif
-	      {
-#  ifndef RTLD_BOOTSTRAP
-#   ifndef SHARED
-		CHECK_STATIC_TLS (map, sym_map);
-#   else
-		if (!TRY_STATIC_TLS (map, sym_map))
-		  {
-		    td->arg = _dl_make_tlsdesc_dynamic
-		      (sym_map, sym->st_value + reloc->r_addend);
-		    td->entry = _dl_tlsdesc_dynamic;
-		  }
-		else
-#   endif
-#  endif
-		  {
-		    td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
-				      + reloc->r_addend);
-		    td->entry = _dl_tlsdesc_return;
-		  }
-	      }
-	  }
-	  break;
-	case R_386_TLS_TPOFF32:
-	  /* The offset is positive, backward from the thread pointer.  */
-	  /* We know the offset of object the symbol is contained in.
-	     It is a positive value which will be subtracted from the
-	     thread pointer.  To get the variable position in the TLS
-	     block we subtract the offset from that of the TLS block.  */
-	  if (sym != NULL)
-	    {
-	      CHECK_STATIC_TLS (map, sym_map);
-	      *reloc_addr = sym_map->l_tls_offset - sym->st_value
-			    + reloc->r_addend;
-	    }
-	  break;
-	case R_386_TLS_TPOFF:
-	  /* The offset is negative, forward from the thread pointer.  */
-	  /* We know the offset of object the symbol is contained in.
-	     It is a negative value which will be added to the
-	     thread pointer.  */
-	  if (sym != NULL)
-	    {
-	      CHECK_STATIC_TLS (map, sym_map);
-	      *reloc_addr = sym->st_value - sym_map->l_tls_offset
-			    + reloc->r_addend;
-	    }
-	  break;
-	case R_386_COPY:
-	  if (sym == NULL)
-	    /* This can happen in trace mode if an object could not be
-	       found.  */
-	    break;
-	  if (__glibc_unlikely (sym->st_size > refsym->st_size)
-	      || (__glibc_unlikely (sym->st_size < refsym->st_size)
-		  && GLRO(dl_verbose)))
-	    {
-	      const char *strtab;
-
-	      strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
-	      _dl_error_printf ("\
-%s: Symbol `%s' has different size in shared object, consider re-linking\n",
-				RTLD_PROGNAME, strtab + refsym->st_name);
-	    }
-	  memcpy (reloc_addr_arg, (void *) value,
-		  MIN (sym->st_size, refsym->st_size));
-	  break;
-	case R_386_IRELATIVE:
-	  value = map->l_addr + reloc->r_addend;
-	  if (__glibc_likely (!skip_ifunc))
-	    value = ((Elf32_Addr (*) (void)) value) ();
-	  *reloc_addr = value;
-	  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;
-	}
-    }
-}
-# endif	/* !RTLD_BOOTSTRAP */
 
 static inline void
 __attribute ((always_inline))
@@ -664,48 +517,4 @@  elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
     _dl_reloc_bad_type (map, r_type, 1);
 }
 
-# ifndef RTLD_BOOTSTRAP
-
-static inline void
-__attribute__ ((always_inline))
-elf_machine_lazy_rela (struct link_map *map, struct r_scope_elem *scope[],
-		       Elf32_Addr l_addr, const Elf32_Rela *reloc,
-		       int skip_ifunc)
-{
-  Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
-  const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
-  if (__glibc_likely (r_type == R_386_JMP_SLOT))
-    ;
-  else if (__glibc_likely (r_type == R_386_TLS_DESC))
-    {
-      const Elf_Symndx symndx = ELFW (R_SYM) (reloc->r_info);
-      const ElfW (Sym) *symtab = (const void *)D_PTR (map, l_info[DT_SYMTAB]);
-      const ElfW (Sym) *sym = &symtab[symndx];
-      const struct r_found_version *version = NULL;
-
-      if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
-	{
-	  const ElfW (Half) *vernum =
-	    (const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
-	  version = &map->l_versions[vernum[symndx] & 0x7fff];
-	}
-
-      /* Always initialize TLS descriptors completely at load time, in
-	 case static TLS is allocated for it that requires locking.  */
-      elf_machine_rela (map, scope, reloc, sym, version, reloc_addr,
-			skip_ifunc);
-    }
-  else if (__glibc_unlikely (r_type == R_386_IRELATIVE))
-    {
-      Elf32_Addr value = map->l_addr + reloc->r_addend;
-      if (__glibc_likely (!skip_ifunc))
-	value = ((Elf32_Addr (*) (void)) value) ();
-      *reloc_addr = value;
-    }
-  else
-    _dl_reloc_bad_type (map, r_type, 1);
-}
-
-# endif	/* !RTLD_BOOTSTRAP */
-
 #endif /* RESOLVE_MAP */