Module Name: src Committed By: martin Date: Tue Nov 26 08:12:27 UTC 2019
Modified Files: src/lib/libc/tls [netbsd-9]: Makefile.inc tls.c src/libexec/ld.elf_so [netbsd-9]: Makefile tls.c src/usr.bin/ldd [netbsd-9]: Makefile.elf Log Message: Pull up following revision(s) (requested by nakayama in ticket #469): lib/libc/tls/tls.c: revision 1.10 lib/libc/tls/tls.c: revision 1.11 lib/libc/tls/tls.c: revision 1.12 lib/libc/tls/tls.c: revision 1.13 libexec/ld.elf_so/tls.c: revision 1.13 libexec/ld.elf_so/tls.c: revision 1.14 libexec/ld.elf_so/Makefile: revision 1.142 lib/libc/tls/Makefile.inc: revision 1.3 usr.bin/ldd/Makefile.elf: revision 1.6 PR 54093: Align static TLS area to max_align_t. Use alignof and not size_t for platforms with non-natural base alignments. Mirror the ld.elf_so logic for handling aligning the TLS size. Most noticable, recompute the start of the TLS area for variant I relative to the TCB. This makes a difference when the segment size and base alignment don't agree. Fix PR/54074 and PR/54093 completely. More similar to the ld.elf_so logic, it is necessary to align with p_align first. Also, invert the #ifdef condition for consistency. Should fix regression for static linking binaries: http://releng.netbsd.org/b5reports/sparc/commits-2019.11.html#2019.11.10.23.39.03 http://releng.netbsd.org/b5reports/sparc64/commits-2019.11.html#2019.11.16.04.10.33 To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.2.46.1 src/lib/libc/tls/Makefile.inc cvs rdiff -u -r1.9 -r1.9.2.1 src/lib/libc/tls/tls.c cvs rdiff -u -r1.141 -r1.141.2.1 src/libexec/ld.elf_so/Makefile cvs rdiff -u -r1.12 -r1.12.2.1 src/libexec/ld.elf_so/tls.c cvs rdiff -u -r1.5 -r1.5.30.1 src/usr.bin/ldd/Makefile.elf Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/tls/Makefile.inc diff -u src/lib/libc/tls/Makefile.inc:1.2 src/lib/libc/tls/Makefile.inc:1.2.46.1 --- src/lib/libc/tls/Makefile.inc:1.2 Sat Mar 12 07:55:09 2011 +++ src/lib/libc/tls/Makefile.inc Tue Nov 26 08:12:26 2019 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.2 2011/03/12 07:55:09 matt Exp $ +# $NetBSD: Makefile.inc,v 1.2.46.1 2019/11/26 08:12:26 martin Exp $ .include <bsd.own.mk> @@ -6,4 +6,4 @@ .PATH: ${.PARSEDIR} ${ARCHDIR}/tls SRCS+= tls.c -CPPFLAGS.tls.c+= -D_LIBC_SOURCE +CPPFLAGS.tls.c+= -D_LIBC_SOURCE -std=gnu11 Index: src/lib/libc/tls/tls.c diff -u src/lib/libc/tls/tls.c:1.9 src/lib/libc/tls/tls.c:1.9.2.1 --- src/lib/libc/tls/tls.c:1.9 Fri Jul 13 19:50:21 2018 +++ src/lib/libc/tls/tls.c Tue Nov 26 08:12:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: tls.c,v 1.9 2018/07/13 19:50:21 joerg Exp $ */ +/* $NetBSD: tls.c,v 1.9.2.1 2019/11/26 08:12:26 martin Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: tls.c,v 1.9 2018/07/13 19:50:21 joerg Exp $"); +__RCSID("$NetBSD: tls.c,v 1.9.2.1 2019/11/26 08:12:26 martin Exp $"); #include "namespace.h" @@ -46,6 +46,7 @@ __RCSID("$NetBSD: tls.c,v 1.9 2018/07/13 #include <link_elf.h> #include <lwp.h> #include <stdbool.h> +#include <stdalign.h> #include <stddef.h> #include <stdlib.h> #include <string.h> @@ -84,15 +85,17 @@ _rtld_tls_allocate(void) uint8_t *p; if (initial_thread_tcb == NULL) { -#ifdef __HAVE_TLS_VARIANT_II - tls_size = roundup2(tls_size, sizeof(void *)); +#ifdef __HAVE_TLS_VARIANT_I + tls_allocation = tls_size; +#else + tls_allocation = roundup2(tls_size, alignof(max_align_t)); #endif - tls_allocation = tls_size + sizeof(*tcb); - initial_thread_tcb = p = mmap(NULL, tls_allocation, - PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); + initial_thread_tcb = p = mmap(NULL, + tls_allocation + sizeof(*tcb), PROT_READ | PROT_WRITE, + MAP_ANON, -1, 0); } else { - p = calloc(1, tls_allocation); + p = calloc(1, tls_allocation + sizeof(*tcb)); } if (p == NULL) { static const char msg[] = "TLS allocation failed, terminating\n"; @@ -105,7 +108,8 @@ _rtld_tls_allocate(void) p += sizeof(struct tls_tcb); #else /* LINTED tls_size is rounded above */ - tcb = (struct tls_tcb *)(p + tls_size); + tcb = (struct tls_tcb *)(p + tls_allocation); + p = (uint8_t *)tcb - tls_size; tcb->tcb_self = tcb; #endif memcpy(p, tls_initaddr, tls_initsize); @@ -125,10 +129,10 @@ _rtld_tls_free(struct tls_tcb *tcb) p = (uint8_t *)tcb; #else /* LINTED */ - p = (uint8_t *)tcb - tls_size; + p = (uint8_t *)tcb - tls_allocation; #endif if (p == initial_thread_tcb) - munmap(p, tls_allocation); + munmap(p, tls_allocation + sizeof(*tcb)); else free(p); } @@ -148,7 +152,11 @@ __libc_static_tls_setup_cb(struct dl_phd continue; tls_initaddr = (void *)(phdr->p_vaddr + data->dlpi_addr); tls_initsize = phdr->p_filesz; +#ifdef __HAVE_TLS_VARIANT_I tls_size = phdr->p_memsz; +#else + tls_size = roundup2(phdr->p_memsz, phdr->p_align); +#endif } return 0; } Index: src/libexec/ld.elf_so/Makefile diff -u src/libexec/ld.elf_so/Makefile:1.141 src/libexec/ld.elf_so/Makefile:1.141.2.1 --- src/libexec/ld.elf_so/Makefile:1.141 Wed Apr 3 21:37:58 2019 +++ src/libexec/ld.elf_so/Makefile Tue Nov 26 08:12:26 2019 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.141 2019/04/03 21:37:58 christos Exp $ +# $NetBSD: Makefile,v 1.141.2.1 2019/11/26 08:12:26 martin Exp $ # # NOTE: when changing ld.so, ensure that ldd still compiles. # @@ -92,6 +92,7 @@ CLEANFILES+= errlist_concat.h ${PROG}.ma BINDIR= ${SHLINKINSTALLDIR} +CPPFLAGS.tls.c+= -std=gnu11 CPPFLAGS+= -DLIBDIR=\"${LIBDIR}\" -D_PATH_RTLD=\"${BINDIR}/${PROG}\" CPPFLAGS+= -I${.CURDIR} -I. -D_KERNTYPES CPPFLAGS+= -DRTLD_LOADER Index: src/libexec/ld.elf_so/tls.c diff -u src/libexec/ld.elf_so/tls.c:1.12 src/libexec/ld.elf_so/tls.c:1.12.2.1 --- src/libexec/ld.elf_so/tls.c:1.12 Sat Apr 13 00:23:32 2019 +++ src/libexec/ld.elf_so/tls.c Tue Nov 26 08:12:26 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: tls.c,v 1.12 2019/04/13 00:23:32 rin Exp $ */ +/* $NetBSD: tls.c,v 1.12.2.1 2019/11/26 08:12:26 martin Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -29,11 +29,13 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: tls.c,v 1.12 2019/04/13 00:23:32 rin Exp $"); +__RCSID("$NetBSD: tls.c,v 1.12.2.1 2019/11/26 08:12:26 martin Exp $"); #include <sys/param.h> #include <sys/ucontext.h> #include <lwp.h> +#include <stdalign.h> +#include <stddef.h> #include <string.h> #include "debug.h" #include "rtld.h" @@ -99,7 +101,7 @@ _rtld_tls_initial_allocation(void) #ifndef __HAVE_TLS_VARIANT_I _rtld_tls_static_space = roundup2(_rtld_tls_static_space, - sizeof(void *)); + alignof(max_align_t)); #endif dbg(("_rtld_tls_static_space %zu", _rtld_tls_static_space)); Index: src/usr.bin/ldd/Makefile.elf diff -u src/usr.bin/ldd/Makefile.elf:1.5 src/usr.bin/ldd/Makefile.elf:1.5.30.1 --- src/usr.bin/ldd/Makefile.elf:1.5 Tue May 7 13:00:35 2013 +++ src/usr.bin/ldd/Makefile.elf Tue Nov 26 08:12:27 2019 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.elf,v 1.5 2013/05/07 13:00:35 christos Exp $ +# $NetBSD: Makefile.elf,v 1.5.30.1 2019/11/26 08:12:27 martin Exp $ # Makefile fragment to build a (32 or 64 bit) libldd_elfxx.a. # Expects CPPFLAGS to have ELFSIZE set, and LIB to be set. @@ -7,4 +7,6 @@ SRCS= ldd_elfxx.c SRCS+= xmalloc.c debug.c expand.c map_object.c load.c search.c \ headers.c paths.c tls.c symver.c +CPPFLAGS.tls.c+= -std=gnu11 + .include "Makefile.common"