CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Sat Dec 3 09:10:40 UTC 2022 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Whitespace. NFC. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/libexec/ld.elf_so/arch/aarch64/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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.16 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.17 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.16 Tue Jun 21 06:52:17 2022 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Sat Dec 3 09:10:40 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.16 2022/06/21 06:52:17 skrll Exp $ */ +/* $NetBSD: mdreloc.c,v 1.17 2022/12/03 09:10:40 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.16 2022/06/21 06:52:17 skrll Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.17 2022/12/03 09:10:40 skrll Exp $"); #endif /* not lint */ #include @@ -288,15 +288,14 @@ _rtld_relocate_nonplt_objects(Obj_Entry rdbg(("TLS_DTPREL %s in %s --> %p", obj->strtab + obj->symtab[symnum].st_name, obj->path, (void *)*where)); - break; + case R_TLS_TYPE(TLS_DTPMOD): *where = (Elf_Addr)(defobj->tlsindex); rdbg(("TLS_DTPMOD %s in %s --> %p", obj->strtab + obj->symtab[symnum].st_name, obj->path, (void *)*where)); - break; case R_TLS_TYPE(TLS_TPREL):
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Sat Dec 3 09:10:40 UTC 2022 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Whitespace. NFC. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: joerg Date: Tue Jun 16 21:01:30 UTC 2020 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Honor addend for R_AARCH64_TLS_TPREL relocation. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/libexec/ld.elf_so/arch/aarch64/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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.14 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13 Fri Jan 18 11:59:03 2019 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Tue Jun 16 21:01:30 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.13 2019/01/18 11:59:03 skrll Exp $ */ +/* $NetBSD: mdreloc.c,v 1.14 2020/06/16 21:01:30 joerg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.13 2019/01/18 11:59:03 skrll Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.14 2020/06/16 21:01:30 joerg Exp $"); #endif /* not lint */ #include @@ -296,8 +296,9 @@ _rtld_relocate_nonplt_objects(Obj_Entry _rtld_tls_offset_allocate(obj)) return -1; - *where = (Elf_Addr)def->st_value + defobj->tlsoffset + - sizeof(struct tls_tcb); + *where = (Elf_Addr)(def->st_value + defobj->tlsoffset + + rela->r_addend + sizeof(struct tls_tcb)); + rdbg(("TLS_TPREL %s in %s --> %p in %s", obj->strtab + obj->symtab[symnum].st_name, obj->path, (void *)*where, defobj->path));
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: joerg Date: Tue Jun 16 21:01:30 UTC 2020 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Honor addend for R_AARCH64_TLS_TPREL relocation. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Fri Jan 18 11:59:04 UTC 2019 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S Log Message: Adapt https://svnweb.freebsd.org/base?view=revision=342113 to NetBSD. This brings us resolving for dynamically loaded libraries and makes tests/libexec/ld.elf_so/t_thread_local_dtor pass. With suggestions from joerg@ To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c cvs rdiff -u -r1.3 -r1.4 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S 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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.12 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.12 Fri Nov 23 11:26:05 2018 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Fri Jan 18 11:59:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.12 2018/11/23 11:26:05 skrll Exp $ */ +/* $NetBSD: mdreloc.c,v 1.13 2019/01/18 11:59:03 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.12 2018/11/23 11:26:05 skrll Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.13 2019/01/18 11:59:03 skrll Exp $"); #endif /* not lint */ #include @@ -70,17 +70,16 @@ __RCSID("$NetBSD: mdreloc.c,v 1.12 2018/ #include "rtld.h" struct tls_data { - int64_t index; - Obj_Entry *obj; - const Elf_Rela *rela; + size_t td_tlsindex; + Elf_Addr td_tlsoffs; }; void _rtld_bind_start(void); void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr); Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word); -void *_rtld_tlsdesc(void *); +void *_rtld_tlsdesc_static(void *); +void *_rtld_tlsdesc_undef(void *); void *_rtld_tlsdesc_dynamic(void *); -int64_t _rtld_tlsdesc_handle(struct tls_data *, u_int); /* * AARCH64 PLT looks like this; @@ -117,67 +116,63 @@ _rtld_setup_pltgot(const Obj_Entry *obj) } static struct tls_data * -_rtld_tlsdesc_alloc(Obj_Entry *obj, const Elf_Rela *rela) +_rtld_tlsdesc_alloc(size_t tlsindex, Elf_Addr offs) { struct tls_data *tlsdesc; tlsdesc = xmalloc(sizeof(*tlsdesc)); - tlsdesc->index = -1; - tlsdesc->obj = obj; - tlsdesc->rela = rela; + tlsdesc->td_tlsindex = tlsindex; + tlsdesc->td_tlsoffs = offs; return tlsdesc; } -static int64_t -_rtld_tlsdesc_handle_locked(struct tls_data *tlsdesc, u_int flags) +static void +_rtld_tlsdesc_fill(const Obj_Entry *obj, const Elf_Rela *rela, Elf_Addr *where, u_int flags) { - const Elf_Rela *rela; const Elf_Sym *def; const Obj_Entry *defobj; - Obj_Entry *obj; - - rela = tlsdesc->rela; - obj = tlsdesc->obj; - - def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, , flags); - if (def == NULL) - _rtld_die(); - - tlsdesc->index = defobj->tlsoffset + def->st_value + rela->r_addend + - sizeof(struct tls_tcb); + Elf_Addr offs = 0; + unsigned long symnum = ELF_R_SYM(rela->r_info); - return tlsdesc->index; -} - -int64_t -_rtld_tlsdesc_handle(struct tls_data *tlsdesc, u_int flags) -{ - sigset_t mask; + if (symnum != 0) { + def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, , + flags); + if (def == NULL) + _rtld_die(); + if (def == &_rtld_sym_zero) { + /* Weak undefined thread variable */ + where[0] = (Elf_Addr)_rtld_tlsdesc_undef; + where[1] = rela->r_addend; - /* We have already found the index, return it */ - if (tlsdesc->index >= 0) - return tlsdesc->index; - - _rtld_exclusive_enter(); - /* tlsdesc->index may have been set by another thread */ - if (tlsdesc->index == -1) - _rtld_tlsdesc_handle_locked(tlsdesc, flags); - _rtld_exclusive_exit(); + rdbg(("TLSDESC %s (weak) in %s --> %p", + obj->strtab + obj->symtab[symnum].st_name, + obj->path, (void *)where[1])); - return tlsdesc->index; -} + return; + } + offs = def->st_value; + } else { + defobj = obj; + } + offs += rela->r_addend; -static void -_rtld_tlsdesc_fill(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 + + if (defobj->tls_done) { + /* Variable is in initialy allocated TLS segment */ + where[0] = (Elf_Addr)_rtld_tlsdesc_static; + where[1] = defobj->tlsoffset + offs + sizeof(struct tls_tcb); + + rdbg(("TLSDESC %s --> %p static", + obj->path, (void *)where[1])); } else { + /* TLS offset is unknown at load time, use dynamic resolving */ where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic; - where[1] = (Elf_Addr)_rtld_tlsdesc_alloc(obj, rela); + where[1] = (Elf_Addr)_rtld_tlsdesc_alloc(defobj->tlsindex, offs); + + rdbg(("TLSDESC %s in %s --> %p dynamic (%zu, %p)", + obj->strtab + obj->symtab[symnum].st_name, + obj->path, (void *)where[1], defobj->tlsindex, (void *)offs)); } } @@ -276,7
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Fri Jan 18 11:59:04 UTC 2019 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S Log Message: Adapt https://svnweb.freebsd.org/base?view=revision=342113 to NetBSD. This brings us resolving for dynamically loaded libraries and makes tests/libexec/ld.elf_so/t_thread_local_dtor pass. With suggestions from joerg@ To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c cvs rdiff -u -r1.3 -r1.4 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Fri Nov 23 11:26:05 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Fix RTLD_DEBUG_RELOC build To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/libexec/ld.elf_so/arch/aarch64/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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.11 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.12 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.11 Fri Nov 23 10:59:20 2018 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Fri Nov 23 11:26:05 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.11 2018/11/23 10:59:20 skrll Exp $ */ +/* $NetBSD: mdreloc.c,v 1.12 2018/11/23 11:26:05 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.11 2018/11/23 10:59:20 skrll Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.12 2018/11/23 11:26:05 skrll Exp $"); #endif /* not lint */ #include @@ -215,7 +215,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry for (const Elf_Rela *rela = obj->rela; rela < obj->relalim; rela++) { Elf_Addr*where; Elf_Addr tmp; - unsigned long symnum; + unsigned long symnum = ULONG_MAX; where = (Elf_Addr *)(obj->relocbase + rela->r_offset); @@ -310,12 +310,11 @@ _rtld_relocate_nonplt_objects(Obj_Entry default: rdbg(("sym = %lu, type = %lu, offset = %p, " - "addend = %p, contents = %p, symbol = %s", + "addend = %p, contents = %p", (u_long)ELF_R_SYM(rela->r_info), (u_long)ELF_R_TYPE(rela->r_info), (void *)rela->r_offset, (void *)rela->r_addend, - (void *)*where, - obj->strtab + obj->symtab[symnum].st_name)); + (void *)*where)); _rtld_error("%s: Unsupported relocation type %ld " "in non-PLT relocations", obj->path, (u_long) ELF_R_TYPE(rela->r_info));
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Fri Nov 23 11:26:05 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Fix RTLD_DEBUG_RELOC build To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Fri Nov 23 10:59:20 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Trailing whitespace To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Fri Nov 23 10:59:20 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Trailing whitespace To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/libexec/ld.elf_so/arch/aarch64/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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.10 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.11 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.10 Thu Sep 20 19:02:22 2018 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Fri Nov 23 10:59:20 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.10 2018/09/20 19:02:22 jakllsch Exp $ */ +/* $NetBSD: mdreloc.c,v 1.11 2018/11/23 10:59:20 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.10 2018/09/20 19:02:22 jakllsch Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.11 2018/11/23 10:59:20 skrll Exp $"); #endif /* not lint */ #include @@ -439,7 +439,7 @@ _rtld_relocate_plt_objects(const Obj_Ent { const Elf_Rela *rela; int err = 0; - + for (rela = obj->pltrela; rela < obj->pltrelalim; rela++) { err = _rtld_relocate_plt_object(obj, rela, NULL); if (err)
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: jakllsch Date: Thu Sep 20 19:02:22 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Revise previous to not deadlock. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/libexec/ld.elf_so/arch/aarch64/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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.9 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.10 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.9 Thu Sep 20 18:41:05 2018 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Thu Sep 20 19:02:22 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.9 2018/09/20 18:41:05 jakllsch Exp $ */ +/* $NetBSD: mdreloc.c,v 1.10 2018/09/20 19:02:22 jakllsch Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.9 2018/09/20 18:41:05 jakllsch Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.10 2018/09/20 19:02:22 jakllsch Exp $"); #endif /* not lint */ #include @@ -412,7 +412,7 @@ _rtld_relocate_plt_object(const Obj_Entr if (ELF_R_SYM(rela->r_info) != 0) { struct tls_data *tlsdesc = (struct tls_data *)where[1]; if (tlsdesc->index == -1) -_rtld_tlsdesc_handle(tlsdesc, SYMLOOK_IN_PLT); +_rtld_tlsdesc_handle_locked(tlsdesc, SYMLOOK_IN_PLT); } break; }
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: jakllsch Date: Thu Sep 20 19:02:22 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Revise previous to not deadlock. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: jakllsch Date: Thu Sep 20 18:41:05 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S Log Message: Improve support for R_AARCH64_TLSDESC relocations. In large part from FreeBSD. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c cvs rdiff -u -r1.2 -r1.3 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: jakllsch Date: Thu Sep 20 18:41:05 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S Log Message: Improve support for R_AARCH64_TLSDESC relocations. In large part from FreeBSD. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c cvs rdiff -u -r1.2 -r1.3 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S 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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.8 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.9 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.8 Mon Jul 16 00:29:37 2018 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Thu Sep 20 18:41:05 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.8 2018/07/16 00:29:37 christos Exp $ */ +/* $NetBSD: mdreloc.c,v 1.9 2018/09/20 18:41:05 jakllsch Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -29,9 +29,38 @@ * POSSIBILITY OF SUCH DAMAGE. */ +/*- + * Copyright (c) 2014-2015 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by Andrew Turner + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *notice, this list of conditions and the following disclaimer in the + *documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.8 2018/07/16 00:29:37 christos Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.9 2018/09/20 18:41:05 jakllsch Exp $"); #endif /* not lint */ #include @@ -40,10 +69,18 @@ __RCSID("$NetBSD: mdreloc.c,v 1.8 2018/0 #include "debug.h" #include "rtld.h" +struct tls_data { + int64_t index; + Obj_Entry *obj; + const Elf_Rela *rela; +}; + void _rtld_bind_start(void); void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr); Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word); void *_rtld_tlsdesc(void *); +void *_rtld_tlsdesc_dynamic(void *); +int64_t _rtld_tlsdesc_handle(struct tls_data *, u_int); /* * AARCH64 PLT looks like this; @@ -79,6 +116,71 @@ _rtld_setup_pltgot(const Obj_Entry *obj) obj->pltgot[2] = (Elf_Addr) &_rtld_bind_start; } +static struct tls_data * +_rtld_tlsdesc_alloc(Obj_Entry *obj, const Elf_Rela *rela) +{ + struct tls_data *tlsdesc; + + tlsdesc = xmalloc(sizeof(*tlsdesc)); + tlsdesc->index = -1; + tlsdesc->obj = obj; + tlsdesc->rela = rela; + + return tlsdesc; +} + +static int64_t +_rtld_tlsdesc_handle_locked(struct tls_data *tlsdesc, u_int flags) +{ + const Elf_Rela *rela; + const Elf_Sym *def; + const Obj_Entry *defobj; + Obj_Entry *obj; + + rela = tlsdesc->rela; + obj = tlsdesc->obj; + + def = _rtld_find_symdef(ELF_R_SYM(rela->r_info), obj, , flags); + if (def == NULL) + _rtld_die(); + + tlsdesc->index = defobj->tlsoffset + def->st_value + rela->r_addend + + sizeof(struct tls_tcb); + + return tlsdesc->index; +} + +int64_t +_rtld_tlsdesc_handle(struct tls_data *tlsdesc, u_int flags) +{ + sigset_t mask; + + /* We have already found the index, return it */ + if (tlsdesc->index >= 0) + return tlsdesc->index; + + _rtld_exclusive_enter(); + /* tlsdesc->index may have been set by another thread */ + if (tlsdesc->index == -1) + _rtld_tlsdesc_handle_locked(tlsdesc, flags); + _rtld_exclusive_exit(); + + return tlsdesc->index; +} + +static void +_rtld_tlsdesc_fill(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 + + sizeof(struct tls_tcb); + } else { + where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic; + where[1] = (Elf_Addr)_rtld_tlsdesc_alloc(obj, rela); + } +} + void
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: christos Date: Mon Jul 16 00:29:37 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Initialize new_value to account for bogus return from the function. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/libexec/ld.elf_so/arch/aarch64/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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.7 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.8 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.7 Sun Feb 4 16:49:51 2018 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Sun Jul 15 20:29:37 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.7 2018/02/04 21:49:51 skrll Exp $ */ +/* $NetBSD: mdreloc.c,v 1.8 2018/07/16 00:29:37 christos Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.7 2018/02/04 21:49:51 skrll Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.8 2018/07/16 00:29:37 christos Exp $"); #endif /* not lint */ #include @@ -311,7 +311,7 @@ Elf_Addr _rtld_bind(const Obj_Entry *obj, Elf_Word relaidx) { const Elf_Rela *rela = obj->pltrela + relaidx; - Elf_Addr new_value; + Elf_Addr new_value = 0; _rtld_shared_enter(); int err = _rtld_relocate_plt_object(obj, rela, _value);
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: christos Date: Mon Jul 16 00:29:37 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: Initialize new_value to account for bogus return from the function. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Sun Feb 4 21:49:51 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S Log Message: Various fixes / changes from Ryo Shimizu / Toru Nishimura to make this work. _rtld_call_ifunc copied from other rela platforms by me - not tested in any way. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c cvs rdiff -u -r1.1 -r1.2 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: skrll Date: Sun Feb 4 21:49:51 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c rtld_start.S Log Message: Various fixes / changes from Ryo Shimizu / Toru Nishimura to make this work. _rtld_call_ifunc copied from other rela platforms by me - not tested in any way. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c cvs rdiff -u -r1.1 -r1.2 src/libexec/ld.elf_so/arch/aarch64/rtld_start.S 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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.6 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.7 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.6 Mon Aug 28 06:59:25 2017 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Sun Feb 4 21:49:51 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $ */ +/* $NetBSD: mdreloc.c,v 1.7 2018/02/04 21:49:51 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.7 2018/02/04 21:49:51 skrll Exp $"); #endif /* not lint */ #include @@ -43,6 +43,7 @@ __RCSID("$NetBSD: mdreloc.c,v 1.6 2017/0 void _rtld_bind_start(void); void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr); Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word); +void *_rtld_tlsdesc(void *); /* * AARCH64 PLT looks like this; @@ -81,23 +82,23 @@ _rtld_setup_pltgot(const Obj_Entry *obj) void _rtld_relocate_nonplt_self(Elf_Dyn *dynp, Elf_Addr relocbase) { - const Elf_Rel *rel = 0, *rellim; - Elf_Addr relsz = 0; + const Elf_Rela *rela = 0, *relalim; + Elf_Addr relasz = 0; Elf_Addr *where; for (; dynp->d_tag != DT_NULL; dynp++) { switch (dynp->d_tag) { - case DT_REL: - rel = (const Elf_Rel *)(relocbase + dynp->d_un.d_ptr); + case DT_RELA: + rela = (const Elf_Rela *)(relocbase + dynp->d_un.d_ptr); break; - case DT_RELSZ: - relsz = dynp->d_un.d_val; + case DT_RELASZ: + relasz = dynp->d_un.d_val; break; } } - rellim = (const Elf_Rel *)((const uint8_t *)rel + relsz); - for (; rel < rellim; rel++) { - where = (Elf_Addr *)(relocbase + rel->r_offset); + relalim = (const Elf_Rela *)((const uint8_t *)rela + relasz); + for (; rela < relalim; rela++) { + where = (Elf_Addr *)(relocbase + rela->r_offset); *where += (Elf_Addr)relocbase; } } @@ -117,8 +118,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry where = (Elf_Addr *)(obj->relocbase + rela->r_offset); switch (ELF_R_TYPE(rela->r_info)) { - case R_TYPE(ABS64): /* word B + S + A */ - case R_TYPE(GLOB_DAT): /* word B + S */ + case R_TYPE(ABS64): /* word S + A */ + case R_TYPE(GLOB_DAT): /* word S + A */ case R_TLS_TYPE(TLS_DTPREL): case R_TLS_TYPE(TLS_DTPMOD): case R_TLS_TYPE(TLS_TPREL): @@ -139,8 +140,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry case R_TYPE(NONE): break; - case R_TYPE(ABS64): /* word B + S + A */ - case R_TYPE(GLOB_DAT): /* word B + S */ + case R_TYPE(ABS64): /* word S + A */ + case R_TYPE(GLOB_DAT): /* word S + A */ tmp = (Elf_Addr)defobj->relocbase + def->st_value + rela->r_addend; if (*where != tmp) @@ -225,28 +226,61 @@ _rtld_relocate_plt_lazy(Obj_Entry *obj) if (!obj->relocbase) return 0; - for (const Elf_Rel *rel = obj->pltrel; rel < obj->pltrellim; rel++) { - Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rel->r_offset); + for (const Elf_Rela *rela = obj->pltrela; rela < obj->pltrelalim; rela++) { + Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rela->r_offset); - assert(ELF_R_TYPE(rel->r_info) == R_TYPE(JUMP_SLOT)); + assert((ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT)) || + (ELF_R_TYPE(rela->r_info) == R_TYPE(TLSDESC))); - /* Just relocate the GOT slots pointing into the PLT */ - *where += (Elf_Addr)obj->relocbase; - rdbg(("fixup !main in %s --> %p", obj->path, (void *)*where)); + switch (ELF_R_TYPE(rela->r_info)) { + case R_TYPE(JUMP_SLOT): + /* Just relocate the GOT slots pointing into the PLT */ + *where += (Elf_Addr)obj->relocbase; + rdbg(("fixup !main in %s --> %p", obj->path, (void *)*where)); + break; + case R_TYPE(TLSDESC): + assert(ELF_R_SYM(rela->r_info) == 0); /* XXX */ + if (ELF_R_SYM(rela->r_info) == 0) { +where[0] = (Elf_Addr)_rtld_tlsdesc; +where[1] = obj->tlsoffset + rela->r_addend + sizeof(struct tls_tcb); + } + break; + } } return 0; } +void +_rtld_call_ifunc(Obj_Entry *obj, sigset_t *mask, u_int cur_objgen) +{ + const Elf_Rela *rela; + Elf_Addr *where, target; + + while (obj->ifunc_remaining > 0 && _rtld_objgen == cur_objgen) { + rela = obj->pltrelalim - obj->ifunc_remaining; + --obj->ifunc_remaining; + if (ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE)) { + where
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: nisimura Date: Mon Aug 28 06:59:26 UTC 2017 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: explain AARCH64 PLT design To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: nisimura Date: Mon Aug 28 06:59:26 UTC 2017 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: explain AARCH64 PLT design To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/libexec/ld.elf_so/arch/aarch64/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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.5 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.6 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.5 Wed Aug 23 09:17:48 2017 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Mon Aug 28 06:59:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $ */ +/* $NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.6 2017/08/28 06:59:25 nisimura Exp $"); #endif /* not lint */ #include @@ -44,9 +44,36 @@ void _rtld_bind_start(void); void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr); Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word); +/* + * AARCH64 PLT looks like this; + * + * PLT HEADER <8 instructions> + * PLT ENTRY #0 <4 instructions> + * PLT ENTRY #1 <4 instructions> + * . + * . + * PLT ENTRY #n <4 instructions> + * + * PLT HEADER + * stp x16, x30, [sp, #-16]! + * adrp x16, (GOT+16) + * ldr x17, [x16, #PLT_GOT+0x10] + * add x16, x16, #PLT_GOT+0x10 + * br x17 + * nop + * nop + * nop + * + * PLT ENTRY #n + * adrp x16, PLTGOT + n * 8 + * ldr x17, [x16, PLTGOT + n * 8] + * add x16, x16, :lo12:PLTGOT + n * 8 + * br x17 + */ void _rtld_setup_pltgot(const Obj_Entry *obj) { + obj->pltgot[1] = (Elf_Addr) obj; obj->pltgot[2] = (Elf_Addr) &_rtld_bind_start; }
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: nisimura Date: Wed Aug 23 09:17:48 UTC 2017 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: - avoid caddr_t. use Elf_Addr instead. - iron out rdbg() errors. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/libexec/ld.elf_so/arch/aarch64/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/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.4 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.5 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.4 Thu Aug 10 19:03:25 2017 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Wed Aug 23 09:17:48 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.4 2017/08/10 19:03:25 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.4 2017/08/10 19:03:25 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.5 2017/08/23 09:17:48 nisimura Exp $"); #endif /* not lint */ #include @@ -42,7 +42,7 @@ __RCSID("$NetBSD: mdreloc.c,v 1.4 2017/0 void _rtld_bind_start(void); void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr); -caddr_t _rtld_bind(const Obj_Entry *, Elf_Word); +Elf_Addr _rtld_bind(const Obj_Entry *, Elf_Word); void _rtld_setup_pltgot(const Obj_Entry *obj) @@ -84,11 +84,10 @@ _rtld_relocate_nonplt_objects(Obj_Entry for (const Elf_Rela *rela = obj->rela; rela < obj->relalim; rela++) { Elf_Addr*where; - unsigned long symnum; - Elf_Addr addend; + Elf_Addr tmp; + unsigned long symnum; where = (Elf_Addr *)(obj->relocbase + rela->r_offset); - addend = rela->r_addend; switch (ELF_R_TYPE(rela->r_info)) { case R_TYPE(ABS64): /* word B + S + A */ @@ -115,17 +114,19 @@ _rtld_relocate_nonplt_objects(Obj_Entry case R_TYPE(ABS64): /* word B + S + A */ case R_TYPE(GLOB_DAT): /* word B + S */ - *where = addend + (Elf_Addr)defobj->relocbase + - def->st_value; + tmp = (Elf_Addr)defobj->relocbase + def->st_value + + rela->r_addend; + if (*where != tmp) +*where = tmp; rdbg(("ABS64/GLOB_DAT %s in %s --> %p @ %p in %s", obj->strtab + obj->symtab[symnum].st_name, obj->path, (void *)tmp, where, defobj->path)); break; case R_TYPE(RELATIVE): /* word B + A */ - *where = addend + (Elf_Addr)obj->relocbase; + *where = (Elf_Addr)(obj->relocbase + rela->r_addend); rdbg(("RELATIVE in %s --> %p", obj->path, - (void *)tmp)); + (void *)*where)); break; case R_TYPE(COPY): @@ -145,11 +146,11 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TLS_TYPE(TLS_DTPREL): - *where = addend + (Elf_Addr)(def->st_value); + *where = (Elf_Addr)(def->st_value + rela->r_addend); - rdbg(("TLS_DTPOFF32 %s in %s --> %p", + rdbg(("TLS_DTPREL %s in %s --> %p", obj->strtab + obj->symtab[symnum].st_name, - obj->path, (void *)tmp)); + obj->path, (void *)*where)); break; case R_TLS_TYPE(TLS_DTPMOD): @@ -157,7 +158,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry rdbg(("TLS_DTPMOD %s in %s --> %p", obj->strtab + obj->symtab[symnum].st_name, - obj->path, (void *)tmp)); + obj->path, (void *)*where)); break; @@ -168,17 +169,18 @@ _rtld_relocate_nonplt_objects(Obj_Entry *where = (Elf_Addr)def->st_value + defobj->tlsoffset + sizeof(struct tls_tcb); - rdbg(("TLS_TPOFF32 %s in %s --> %p", + rdbg(("TLS_TPREL %s in %s --> %p in %s", obj->strtab + obj->symtab[symnum].st_name, - obj->path, (void *)tmp)); + obj->path, (void *)*where, defobj->path)); break; default: rdbg(("sym = %lu, type = %lu, offset = %p, " - "contents = %p, symbol = %s", + "addend = %p, contents = %p, symbol = %s", (u_long)ELF_R_SYM(rela->r_info), (u_long)ELF_R_TYPE(rela->r_info), - (void *)rela->r_offset, *where, + (void *)rela->r_offset, (void *)rela->r_addend, + (void *)*where, obj->strtab + obj->symtab[symnum].st_name)); _rtld_error("%s: Unsupported relocation type %ld " "in non-PLT relocations", @@ -244,7 +246,7 @@ _rtld_relocate_plt_object(const Obj_Entr return 0; } -caddr_t +Elf_Addr _rtld_bind(const Obj_Entry *obj, Elf_Word reloff) { const Elf_Rel *rel = obj->pltrel + reloff; @@ -256,7 +258,7 @@ _rtld_bind(const Obj_Entry *obj, Elf_Wor _rtld_die(); _rtld_shared_exit(); - return (caddr_t)new_value; + return new_value; } int _rtld_relocate_plt_objects(const Obj_Entry *obj)
CVS commit: src/libexec/ld.elf_so/arch/aarch64
Module Name:src Committed By: nisimura Date: Wed Aug 23 09:17:48 UTC 2017 Modified Files: src/libexec/ld.elf_so/arch/aarch64: mdreloc.c Log Message: - avoid caddr_t. use Elf_Addr instead. - iron out rdbg() errors. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.