[5/5] i386: Remove RELA support
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
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
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.
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.
@@ -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)
@@ -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 */