diff options
| author | joerg <joerg@NetBSD.org> | 2011-11-22 15:25:28 +0000 |
|---|---|---|
| committer | joerg <joerg@NetBSD.org> | 2011-11-22 15:25:28 +0000 |
| commit | 3da75874e99bc91a8cb6625767f86ad3dce058a0 (patch) | |
| tree | 08dfdea398343ec9bf7ea5dfc4c370b9db84ee0e /libexec | |
| parent | 1e1c62cbbea1a14109d99ff1b012b8ceb187b94e (diff) | |
Add TLS support for m68k.
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/ld.elf_so/arch/m68k/mdreloc.c | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/libexec/ld.elf_so/arch/m68k/mdreloc.c b/libexec/ld.elf_so/arch/m68k/mdreloc.c index f20cdb0d73b..69ad8737f23 100644 --- a/libexec/ld.elf_so/arch/m68k/mdreloc.c +++ b/libexec/ld.elf_so/arch/m68k/mdreloc.c @@ -1,13 +1,13 @@ -/* $NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.29 2011/11/22 15:25:28 joerg Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.29 2011/11/22 15:25:28 joerg Exp $"); #endif /* not lint */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.29 2011/11/22 15:25:28 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -126,6 +126,47 @@ _rtld_relocate_nonplt_objects(Obj_Entry *obj) rdbg(("COPY (avoid in main)")); break; + case R_TYPE(TLS_DTPMOD32): + def = _rtld_find_symdef(symnum, obj, &defobj, false); + if (def == NULL) + return -1; + + *where = (Elf_Addr)defobj->tlsindex; + rdbg(("DTPMOD32 %s in %s --> %p in %s", + obj->strtab + obj->symtab[symnum].st_name, + obj->path, (void *)*where, defobj->path)); + break; + + case R_TYPE(TLS_DTPREL32): + 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)(def->st_value + rela->r_addend + - TLS_DTV_OFFSET); + rdbg(("DTPREL32 %s in %s --> %p in %s", + obj->strtab + obj->symtab[symnum].st_name, + obj->path, (void *)*where, defobj->path)); + break; + + case R_TYPE(TLS_TPREL32): + 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)(def->st_value + rela->r_addend + + defobj->tlsoffset - TLS_TP_OFFSET); + rdbg(("TPREL32 %s in %s --> %p in %s", + obj->strtab + obj->symtab[symnum].st_name, + obj->path, (void *)*where, defobj->path)); + break; + default: rdbg(("sym = %lu, type = %lu, offset = %p, " "addend = %p, contents = %p, symbol = %s", |
