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:
Andrew Turner 2017-01-25 17:35:11 +00:00
parent 61ef24a5a3
commit 02dbdb1677
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=312764

View File

@ -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);