aarch64: Handle fewer relocations for RTLD_BOOTSTRAP

The RTLD_BOOTSTRAP branch is used to relocate ld.so itself.  It only
needs to handle RELATIVE, GLOB_DAT, and JUMP_SLOT.
TLSDESC/TLS_DTPMOD/TLS_DTPREL handling can be removed.  Remove
`case AARCH64_R(RELATIVE)` as well as elf_machine_rela has checked it.

Tested on aarch64-linux-gnu.
This commit is contained in:
Fangrui Song 2022-06-15 19:21:53 -07:00
parent 57919813e7
commit e89913d0aa
1 changed files with 15 additions and 18 deletions

View File

@ -178,7 +178,9 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
return; return;
else else
{ {
# ifndef RTLD_BOOTSTRAP
const ElfW(Sym) *const refsym = sym; const ElfW(Sym) *const refsym = sym;
# endif
struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
r_type); r_type);
ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true); ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true);
@ -191,6 +193,18 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
switch (r_type) switch (r_type)
{ {
case AARCH64_R(GLOB_DAT):
case AARCH64_R(JUMP_SLOT):
*reloc_addr = value + reloc->r_addend;
break;
# ifndef RTLD_BOOTSTRAP
case AARCH64_R(ABS32):
# ifdef __LP64__
case AARCH64_R(ABS64):
# endif
*reloc_addr = value + reloc->r_addend;
break;
case AARCH64_R(COPY): case AARCH64_R(COPY):
if (sym == NULL) if (sym == NULL)
break; break;
@ -210,30 +224,17 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
? sym->st_size : refsym->st_size); ? sym->st_size : refsym->st_size);
break; break;
case AARCH64_R(RELATIVE):
case AARCH64_R(GLOB_DAT):
case AARCH64_R(JUMP_SLOT):
case AARCH64_R(ABS32):
#ifdef __LP64__
case AARCH64_R(ABS64):
#endif
*reloc_addr = value + reloc->r_addend;
break;
case AARCH64_R(TLSDESC): case AARCH64_R(TLSDESC):
{ {
struct tlsdesc volatile *td = struct tlsdesc volatile *td =
(struct tlsdesc volatile *)reloc_addr; (struct tlsdesc volatile *)reloc_addr;
#ifndef RTLD_BOOTSTRAP
if (! sym) if (! sym)
{ {
td->arg = (void*)reloc->r_addend; td->arg = (void*)reloc->r_addend;
td->entry = _dl_tlsdesc_undefweak; td->entry = _dl_tlsdesc_undefweak;
} }
else else
#endif
{ {
#ifndef RTLD_BOOTSTRAP
# ifndef SHARED # ifndef SHARED
CHECK_STATIC_TLS (map, sym_map); CHECK_STATIC_TLS (map, sym_map);
# else # else
@ -245,7 +246,6 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
} }
else else
# endif # endif
#endif
{ {
td->arg = (void*)(sym->st_value + sym_map->l_tls_offset td->arg = (void*)(sym->st_value + sym_map->l_tls_offset
+ reloc->r_addend); + reloc->r_addend);
@ -256,14 +256,10 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
} }
case AARCH64_R(TLS_DTPMOD): case AARCH64_R(TLS_DTPMOD):
#ifdef RTLD_BOOTSTRAP
*reloc_addr = 1;
#else
if (sym_map != NULL) if (sym_map != NULL)
{ {
*reloc_addr = sym_map->l_tls_modid; *reloc_addr = sym_map->l_tls_modid;
} }
#endif
break; break;
case AARCH64_R(TLS_DTPREL): case AARCH64_R(TLS_DTPREL):
@ -286,6 +282,7 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
value = elf_ifunc_invoke (value); value = elf_ifunc_invoke (value);
*reloc_addr = value; *reloc_addr = value;
break; break;
# endif /* !RTLD_BOOTSTRAP */
default: default:
_dl_reloc_bad_type (map, r_type, 0); _dl_reloc_bad_type (map, r_type, 0);