Index: libexec/ld.elf_so/arch/i386/mdreloc.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/arch/i386/mdreloc.c,v retrieving revision 1.34 diff -u -p -u -r1.34 mdreloc.c --- libexec/ld.elf_so/arch/i386/mdreloc.c 25 Mar 2011 18:07:05 -0000 1.34 +++ libexec/ld.elf_so/arch/i386/mdreloc.c 13 Oct 2012 08:46:38 -0000 @@ -129,13 +129,28 @@ _rtld_relocate_nonplt_objects(Obj_Entry _rtld_tls_offset_allocate(obj)) return -1; - *where = (Elf_Addr)(def->st_value - defobj->tlsoffset); + *where += (Elf_Addr)(def->st_value - defobj->tlsoffset); rdbg(("TLS_TPOFF %s in %s --> %p", obj->strtab + obj->symtab[symnum].st_name, obj->path, (void *)*where)); break; + case R_TYPE(TLS_TPOFF32): + def = _rtld_find_symdef(symnum, obj, &defobj, false); + if (def == NULL) + return -1; + + if (!defobj->tls_done && + _rtld_tls_offset_allocate(obj)) + return -1; + + *where += (Elf_Addr)(defobj->tlsoffset - def->st_value); + rdbg(("TLS_TPOFF32 %s in %s --> %p", + obj->strtab + obj->symtab[symnum].st_name, + obj->path, (void *)*where)); + break; + case R_TYPE(TLS_DTPMOD32): def = _rtld_find_symdef(symnum, obj, &defobj, false); if (def == NULL)