From patchwork Wed May 6 20:35:35 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roland McGrath X-Patchwork-Id: 469134 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 17923140779 for ; Thu, 7 May 2015 06:35:45 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=sourceware.org header.i=@sourceware.org header.b=WHi+SlZ2; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:content-type :content-transfer-encoding:from:to:subject:message-id:date; q= dns; s=default; b=QoaBsHHptQVhj/zGBpKWpsuZzQ58Q5lxUO7TEQK7nIy3Fv D/ZddEZEhGTDwo0wumqZJm5sS70S0cpdsRCYLaoTEyM4rXOIO7IICevGaEMXJnyw L8xqzHn+TF7iH+RBc1y8NJhbknL38BzW933nDO0jbrDmDF57348lO4RInkIsE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:content-type :content-transfer-encoding:from:to:subject:message-id:date; s= default; bh=jh0agDOQWXezISXL7HkdICrMJwI=; b=WHi+SlZ2GJJyO0m6oqLC bat0y4ayPR2YRygQVEKh84runkwYV5KN8vkRLX4lrOf/Lgx+B8W2DiIF3MyHIx2/ mORhBe9dgcnVvr1t/F8QwMbqIW7b4Ti/CfdDOV/VXfmXVULKDL05BrOOxE/q/xUd oteKbSNH/nNXMt4/B28KdeM= Received: (qmail 60390 invoked by alias); 6 May 2015 20:35:40 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 60380 invoked by uid 89); 6 May 2015 20:35:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY autolearn=no version=3.3.2 X-HELO: topped-with-meat.com MIME-Version: 1.0 From: Roland McGrath To: "GNU C. Library" Subject: [COMMITTED PATCH] BZ#18383: Add test case for large alignment in TLS blocks. Message-Id: <20150506203535.48EAF2C3B9D@topped-with-meat.com> Date: Wed, 6 May 2015 13:35:35 -0700 (PDT) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=SvUDtp+0 c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=14OXPxybAAAA:8 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=mDV3o1hIAAAA:8 a=LsiIQ8UuZVEclBIXtKkA:9 a=CjuIK1q_8ugA:10 I just filed this bug and committed this test case for it. I've marked both flavors of the test as XFAIL. On ARM, both flavors fail (wrong alignment). On x86-64 the dynamically-linked test works right but the statically-linked test crashes in startup. I suspect other machines are affected as well and that the bug is not actually machine-dependent. I will probably try to look into this next week, but it would be lovely if someone else wants to take a crack at it first. Thanks, Roland [BZ #18383] * elf/tst-tlsalign.c: New file. * elf/tst-tlsalign-static.c: New file. * elf/tst-tlsalign-lib.c: New file. * elf/Makefile [$(build-shared) = yes] (tests): Add tst-tlsalign. (tests-static): Add tst-tlsalign-static. (modules-names): Add tst-tlsalign-lib. (test-xfail-tst-tlsalign): New variable. (test-xfail-tst-tlsalign-static): New variable. diff --git a/elf/Makefile b/elf/Makefile index e852b5f..34450ea 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -121,7 +121,7 @@ tests = tst-tls1 tst-tls2 tst-tls9 tst-leaks1 \ tst-auxv tests-static = tst-tls1-static tst-tls2-static tst-stackguard1-static \ tst-leaks1-static tst-array1-static tst-array5-static \ - tst-ptrguard1-static tst-dl-iter-static + tst-ptrguard1-static tst-dl-iter-static tst-tlsalign-static ifeq (yes,$(build-shared)) tests-static += tst-tls9-static tst-tls9-static-ENV = \ @@ -146,7 +146,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ tst-stackguard1 tst-addr1 tst-thrlock \ tst-unique1 tst-unique2 $(if $(CXX),tst-unique3 tst-unique4) \ tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \ - tst-ptrguard1 + tst-ptrguard1 tst-tlsalign # reldep9 ifeq ($(build-hardcoded-path-in-tests),yes) tests += tst-dlopen-aout @@ -212,7 +212,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ tst-initorder2a tst-initorder2b tst-initorder2c \ tst-initorder2d \ tst-relsort1mod1 tst-relsort1mod2 tst-array2dep \ - tst-array5dep tst-null-argv-lib + tst-array5dep tst-null-argv-lib \ + tst-tlsalign-lib ifeq (yes,$(have-protected-data)) modules-names += tst-protected1moda tst-protected1modb tests += tst-protected1a tst-protected1b @@ -525,6 +526,11 @@ $(objpfx)tst-initordera3.so: $(objpfx)tst-initorderb2.so $(objpfx)tst-initorderb $(objpfx)tst-initordera4.so: $(objpfx)tst-initordera3.so $(objpfx)tst-initorder: $(objpfx)tst-initordera4.so $(objpfx)tst-initordera1.so $(objpfx)tst-initorderb2.so $(objpfx)tst-null-argv: $(objpfx)tst-null-argv-lib.so +$(objpfx)tst-tlsalign: $(objpfx)tst-tlsalign-lib.so + +# BZ#18383: broken on at least ARM (both) and x86-64 (static only). +test-xfail-tst-tlsalign = yes +test-xfail-tst-tlsalign-static = yes tst-null-argv-ENV = LD_DEBUG=all LD_DEBUG_OUTPUT=$(objpfx)tst-null-argv.debug.out LDFLAGS-nodel2mod3.so = $(no-as-needed) diff --git a/elf/tst-tlsalign-lib.c b/elf/tst-tlsalign-lib.c new file mode 100644 index 0000000..4371e58 --- /dev/null +++ b/elf/tst-tlsalign-lib.c @@ -0,0 +1,6 @@ +__thread int mod_tdata1 = 1; +__thread int mod_tdata2 __attribute__ ((aligned (0x10))) = 2; +__thread int mod_tdata3 __attribute__ ((aligned (0x1000))) = 4; +__thread int mod_tbss1; +__thread int mod_tbss2 __attribute__ ((aligned (0x10))); +__thread int mod_tbss3 __attribute__ ((aligned (0x1000))); diff --git a/elf/tst-tlsalign-static.c b/elf/tst-tlsalign-static.c new file mode 100644 index 0000000..1671abf --- /dev/null +++ b/elf/tst-tlsalign-static.c @@ -0,0 +1,2 @@ +#define NO_LIB +#include "tst-tlsalign.c" diff --git a/elf/tst-tlsalign.c b/elf/tst-tlsalign.c new file mode 100644 index 0000000..da04f57 --- /dev/null +++ b/elf/tst-tlsalign.c @@ -0,0 +1,85 @@ +/* Test for large alignment in TLS blocks, BZ#18383. + Copyright (C) 2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include + +static __thread int tdata1 = 1; +static __thread int tdata2 __attribute__ ((aligned (0x10))) = 2; +static __thread int tdata3 __attribute__ ((aligned (0x1000))) = 4; +static __thread int tbss1; +static __thread int tbss2 __attribute__ ((aligned (0x10))); +static __thread int tbss3 __attribute__ ((aligned (0x1000))); + +#ifndef NO_LIB +extern __thread int mod_tdata1; +extern __thread int mod_tdata2; +extern __thread int mod_tdata3; +extern __thread int mod_tbss1; +extern __thread int mod_tbss2; +extern __thread int mod_tbss3; +#endif + +static int +test_one (const char *which, unsigned int alignment, int *var, int value) +{ + uintptr_t addr = (uintptr_t) var; + unsigned int misalign = addr & (alignment - 1); + + printf ("%s TLS address %p %% %u = %u\n", + which, (void *) var, alignment, misalign); + + int got = *var; + if (got != value) + { + printf ("%s value %d should be %d\n", which, got, value); + return 1; + } + + return misalign != 0; +} + +static int +do_test (void) +{ + int fail = 0; + + fail |= test_one ("tdata1", 4, &tdata1, 1); + fail |= test_one ("tdata2", 0x10, &tdata2, 2); + fail |= test_one ("tdata3", 0x1000, &tdata3, 4); + + fail |= test_one ("tbss1", 4, &tbss1, 0); + fail |= test_one ("tbss2", 0x10, &tbss2, 0); + fail |= test_one ("tbss3", 0x1000, &tbss3, 0); + +#ifndef NO_LIB + fail |= test_one ("mod_tdata1", 4, &mod_tdata1, 1); + fail |= test_one ("mod_tdata2", 0x10, &mod_tdata2, 2); + fail |= test_one ("mod_tdata3", 0x1000, &mod_tdata3, 4); + + fail |= test_one ("mod_tbss1", 4, &mod_tbss1, 0); + fail |= test_one ("mod_tbss2", 0x10, &mod_tbss2, 0); + fail |= test_one ("mod_tbss3", 0x1000, &mod_tbss3, 0); +#endif + + return fail ? EXIT_FAILURE : EXIT_SUCCESS; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c"