diff options
author | Andrew Turner <andrew@FreeBSD.org> | 2017-01-25 17:35:11 +0000 |
---|---|---|
committer | Andrew Turner <andrew@FreeBSD.org> | 2017-01-25 17:35:11 +0000 |
commit | 02dbdb16776be2ad5ef492a27e74a1c81b998c72 (patch) | |
tree | 6fb5bf6cc962c40ecff0c5e4030689a16c74127c /libexec | |
parent | 61ef24a5a31de3ec3bb3e60bdfb7dabc7f89c967 (diff) | |
download | src-02dbdb16776be2ad5ef492a27e74a1c81b998c72.tar.gz src-02dbdb16776be2ad5ef492a27e74a1c81b998c72.zip |
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
Notes
Notes:
svn path=/head/; revision=312764
Diffstat (limited to 'libexec')
-rw-r--r-- | libexec/rtld-elf/aarch64/reloc.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/libexec/rtld-elf/aarch64/reloc.c b/libexec/rtld-elf/aarch64/reloc.c index 3f9de07db29f..81084769dfd4 100644 --- a/libexec/rtld-elf/aarch64/reloc.c +++ b/libexec/rtld-elf/aarch64/reloc.c @@ -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); |