mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-04 09:09:56 +00:00
Pull the R_AARCH64_TLSDESC code out into a common function and use them in
both the plt and non-plt case. This fixes an issue where libraries built with LLD can fail with "Unhandled relocation 1031" PR: 214971 Obtained from: 1 week Sponsored by: DARPA, AFRL
This commit is contained in:
parent
61ef24a5a3
commit
02dbdb1677
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=312764
@ -184,6 +184,18 @@ rtld_tlsdesc_handle(struct tls_data *tlsdesc, int flags)
|
||||
return (tlsdesc->index);
|
||||
}
|
||||
|
||||
static void
|
||||
reloc_tlsdesc(Obj_Entry *obj, const Elf_Rela *rela, Elf_Addr *where)
|
||||
{
|
||||
if (ELF_R_SYM(rela->r_info) == 0) {
|
||||
where[0] = (Elf_Addr)_rtld_tlsdesc;
|
||||
where[1] = obj->tlsoffset + rela->r_addend;
|
||||
} else {
|
||||
where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic;
|
||||
where[1] = (Elf_Addr)reloc_tlsdesc_alloc(obj, rela);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Process the PLT relocations.
|
||||
*/
|
||||
@ -204,14 +216,7 @@ reloc_plt(Obj_Entry *obj)
|
||||
*where += (Elf_Addr)obj->relocbase;
|
||||
break;
|
||||
case R_AARCH64_TLSDESC:
|
||||
if (ELF_R_SYM(rela->r_info) == 0) {
|
||||
where[0] = (Elf_Addr)_rtld_tlsdesc;
|
||||
where[1] = obj->tlsoffset + rela->r_addend;
|
||||
} else {
|
||||
where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic;
|
||||
where[1] = (Elf_Addr)reloc_tlsdesc_alloc(obj,
|
||||
rela);
|
||||
}
|
||||
reloc_tlsdesc(obj, rela, where);
|
||||
break;
|
||||
default:
|
||||
_rtld_error("Unknown relocation type %u in PLT",
|
||||
@ -362,6 +367,9 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
case R_AARCH64_TLSDESC:
|
||||
reloc_tlsdesc(obj, rela, where);
|
||||
break;
|
||||
case R_AARCH64_TLS_TPREL64:
|
||||
def = find_symdef(symnum, obj, &defobj, flags, cache,
|
||||
lockstate);
|
||||
|
Loading…
Reference in New Issue
Block a user