Module Name: src Committed By: apb Date: Wed Nov 7 07:24:46 UTC 2012
Modified Files: src/libexec/ld.elf_so/arch/i386: mdreloc.c Log Message: Add support for R_386_TLS_TPOFF32. This patch was created by Nick Hudson for PR 47061. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/libexec/ld.elf_so/arch/i386/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/ld.elf_so/arch/i386/mdreloc.c diff -u src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.34 src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.35 --- src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.34 Fri Mar 25 18:07:05 2011 +++ src/libexec/ld.elf_so/arch/i386/mdreloc.c Wed Nov 7 07:24:46 2012 @@ -1,8 +1,8 @@ -/* $NetBSD: mdreloc.c,v 1.34 2011/03/25 18:07:05 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.35 2012/11/07 07:24:46 apb Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.34 2011/03/25 18:07:05 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.35 2012/11/07 07:24:46 apb Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -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)