svn commit: r317189 - stable/11/libexec/rtld-elf/aarch64
Andrew Turner
andrew at FreeBSD.org
Thu Apr 20 12:48:03 UTC 2017
Author: andrew
Date: Thu Apr 20 12:48:01 2017
New Revision: 317189
URL: https://svnweb.freebsd.org/changeset/base/317189
Log:
MFC r312764:
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"
Modified:
stable/11/libexec/rtld-elf/aarch64/reloc.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/libexec/rtld-elf/aarch64/reloc.c
==============================================================================
--- stable/11/libexec/rtld-elf/aarch64/reloc.c Thu Apr 20 11:52:10 2017 (r317188)
+++ stable/11/libexec/rtld-elf/aarch64/reloc.c Thu Apr 20 12:48:01 2017 (r317189)
@@ -184,6 +184,18 @@ rtld_tlsdesc_handle(struct tls_data *tls
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",
@@ -361,6 +366,9 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry
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);
More information about the svn-src-all
mailing list