diff --git a/libexec/rtld-elf/arm/reloc.c b/libexec/rtld-elf/arm/reloc.c --- a/libexec/rtld-elf/arm/reloc.c +++ b/libexec/rtld-elf/arm/reloc.c @@ -279,16 +279,23 @@ if (!defobj->tls_static && !allocate_tls_offset(obj)) return -1; - tmp = (Elf_Addr)def->st_value + defobj->tlsoffset; + if (__predict_true(RELOC_ALIGNED_P(where))) + tmp = *where; + else + tmp = load_ptr(where); + + tmp += (Elf_Addr)(def->st_value) + defobj->tlsoffset; + if (__predict_true(RELOC_ALIGNED_P(where))) *where = tmp; else store_ptr(where, tmp); + dbg("TLS_TPOFF32 %s in %s --> %p", obj->strtab + obj->symtab[symnum].st_name, obj->path, (void *)tmp); - break; + break; default: dbg("sym = %lu, type = %lu, offset = %p, "