mirror of git://sourceware.org/git/glibc.git
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:
parent
57919813e7
commit
e89913d0aa
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue