From patchwork Thu Oct 30 00:22:17 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlos O'Donell X-Patchwork-Id: 3494 Received: (qmail 10806 invoked by alias); 30 Oct 2014 00:22:33 -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 10774 invoked by uid 89); 30 Oct 2014 00:22:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.9 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Message-ID: <545184B9.2000305@redhat.com> Date: Wed, 29 Oct 2014 20:22:17 -0400 From: "Carlos O'Donell" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.1.0 MIME-Version: 1.0 To: Roland McGrath CC: GNU C Library Subject: [PATCH] Run ld.so through check-localplt, check-textrel, and check-execstack. References: <5449C26B.4070600@redhat.com> <20141024170123.1F89B2C3ADA@topped-with-meat.com> <544AB7D1.9060809@redhat.com> <20141024214045.53D4E2C3AB6@topped-with-meat.com> In-Reply-To: <20141024214045.53D4E2C3AB6@topped-with-meat.com> On 10/24/2014 05:40 PM, Roland McGrath wrote: > It's a surprise to me too, and I had to check to convince myself it really > wasn't tested somehow. I don't see any reason it shouldn't be per se. Add > it to the list and verify nothing goes wrong. But there are reasons it's > far less likely ever to be a problem. ld.so has no dependencies and is > built with -z defs, so it can never have undefined references and can never > have PLT entries for anything but its own exported symbols (unless the > linker grows new bugs). There is a very small set of exported symbols > (elf/Versions) that almost never changes. How is this then? I've added ld.so to the check-localplt, check-textrel, and check-execstack tests. It fails only in check-localplt because there are 6 symbols which need to be accounted. Based on my analysis every architecture that has TLS will have: __tls_get_addr, with the exception of i386 which has ___tls_get_addr, and ppc64* which doesn't have it at all as a consequence of the ABI. All machines should also have __libc_memalign, malloc, calloc, realloc, and free in ld.so's PLT entry list. No regressions on x86-64 and i386. Not tested on any other machines. I expect the machine maintainers to cleanup and I'll email them. OK? Cheers, Carlos. 2014-10-29 Carlos O'Donell * elf/Makefile (all-built-dso): Add $(common-objpfx)elf/ld.so. (localplt-build-dso): Add elf/ld.so. * sysdeps/unix/sysv/linux/i386/localplt.data: Add ___tls_get_addr, __libc_memalign, malloc, calloc, realloc, and free for ld.so. * sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data: Add __libc_memalign, malloc, calloc, realloc, and free for ld.so. * sysdeps/generic/localplt.data: Add __tls_get_addr, __libc_memalign, malloc, calloc, realloc and free for ld.so. * sysdeps/unix/sysv/linux/aarch64/localplt.data: Likewise. * sysdeps/unix/sysv/linux/alpha/localplt.data: Likewise. * sysdeps/unix/sysv/linux/arm/localplt.data: Likewise. * sysdeps/unix/sysv/linux/ia64/localplt.data: Likewise. * sysdeps/unix/sysv/linux/m68k/localplt.data: Likewise. * sysdeps/unix/sysv/linux/microblaze/localplt.data: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data: Likewise. * sysdeps/unix/sysv/linux/s390/localplt.data: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data: Likewise. --- Cheers, Carlos. diff --git a/elf/Makefile b/elf/Makefile index 94074f3..34f0b1f 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -904,7 +904,7 @@ CFLAGS-tst-pie2.c += $(pie-ccflag) $(objpfx)tst-pie1: $(objpfx)tst-piemod1.so ifeq (yes,$(build-shared)) -all-built-dso := $(common-objpfx)libc.so \ +all-built-dso := $(common-objpfx)elf/ld.so $(common-objpfx)libc.so \ $(filter-out $(common-objpfx)linkobj/libc.so, \ $(sort $(wildcard $(addprefix $(common-objpfx), \ */lib*.so \ @@ -963,6 +963,7 @@ common-generated += $(all-built-dso:$(common-objpfx)%=%.jmprel) localplt-built-dso := $(addprefix $(common-objpfx),\ libc.so \ + elf/ld.so \ math/libm.so \ rt/librt.so \ dlfcn/libdl.so \ diff --git a/sysdeps/generic/localplt.data b/sysdeps/generic/localplt.data index d296519..d7d6734 100644 --- a/sysdeps/generic/localplt.data +++ b/sysdeps/generic/localplt.data @@ -7,3 +7,12 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/aarch64/localplt.data b/sysdeps/unix/sysv/linux/aarch64/localplt.data index dfca9a7..a3392d3 100644 --- a/sysdeps/unix/sysv/linux/aarch64/localplt.data +++ b/sysdeps/unix/sysv/linux/aarch64/localplt.data @@ -12,3 +12,12 @@ libm.so: matherr libm.so: __signbit libm.so: __signbitf libm.so: __signbitl +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/alpha/localplt.data b/sysdeps/unix/sysv/linux/alpha/localplt.data index 6b2e515..e2a4311 100644 --- a/sysdeps/unix/sysv/linux/alpha/localplt.data +++ b/sysdeps/unix/sysv/linux/alpha/localplt.data @@ -24,3 +24,12 @@ libm.so: matherr # We used to offer inline functions that used this, so it must be exported. # Ought to reorg things such that carg isn't thus forced to use a plt. libm.so: __atan2 +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/arm/localplt.data b/sysdeps/unix/sysv/linux/arm/localplt.data index 109522e..85160bd 100644 --- a/sysdeps/unix/sysv/linux/arm/localplt.data +++ b/sysdeps/unix/sysv/linux/arm/localplt.data @@ -11,3 +11,12 @@ libm.so: __signbitf libm.so: matherr libpthread.so: __errno_location libpthread.so: raise +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/i386/localplt.data b/sysdeps/unix/sysv/linux/i386/localplt.data index 8fb56b6..009797b 100644 --- a/sysdeps/unix/sysv/linux/i386/localplt.data +++ b/sysdeps/unix/sysv/linux/i386/localplt.data @@ -5,3 +5,14 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr +# The dynamic loader needs ___tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +# Note that it is triple underscore for ___tls_get_addr e.g. the alternate +# ABI. +ld.so: ___tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/ia64/localplt.data b/sysdeps/unix/sysv/linux/ia64/localplt.data index ba48816..bc2ce41 100644 --- a/sysdeps/unix/sysv/linux/ia64/localplt.data +++ b/sysdeps/unix/sysv/linux/ia64/localplt.data @@ -6,3 +6,12 @@ libc.so: realloc libm.so: matherr libm.so: matherrf libm.so: matherrl +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/m68k/localplt.data b/sysdeps/unix/sysv/linux/m68k/localplt.data index d266b8f..15a9fe5 100644 --- a/sysdeps/unix/sysv/linux/m68k/localplt.data +++ b/sysdeps/unix/sysv/linux/m68k/localplt.data @@ -6,3 +6,12 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/microblaze/localplt.data b/sysdeps/unix/sysv/linux/microblaze/localplt.data index 6dd5bcb..f488c95 100644 --- a/sysdeps/unix/sysv/linux/microblaze/localplt.data +++ b/sysdeps/unix/sysv/linux/microblaze/localplt.data @@ -9,3 +9,12 @@ libm.so: __signbit libm.so: __signbitf libm.so: matherr libpthread.so: __errno_location +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data index 8fb56b6..619b417 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/localplt.data @@ -5,3 +5,12 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data index 6332a00..78ecd4a 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/localplt.data @@ -38,3 +38,12 @@ libm.so: __signbitl libm.so: copysignl ? libm.so: fabsl libm.so: matherr +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data index 2219aa9..75bcee6 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/localplt.data @@ -4,3 +4,12 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr +# The dynamic loader uses __libc_memalign internally to allocate aligned +# TLS storage. The other malloc family of functions are expected to +# allow user symbol interposition. Note that because of the way the TLS +# ABI works there is no PLT call to __tls_get_addr on ppc64 and ppc64le. +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/s390/localplt.data b/sysdeps/unix/sysv/linux/s390/localplt.data index 8fb56b6..619b417 100644 --- a/sysdeps/unix/sysv/linux/s390/localplt.data +++ b/sysdeps/unix/sysv/linux/s390/localplt.data @@ -5,3 +5,12 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data index 15ba18b..81c1650 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/localplt.data @@ -15,3 +15,12 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data index 6f1769c..d6f9e02 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/localplt.data @@ -17,3 +17,12 @@ libc.so: malloc libc.so: memalign libc.so: realloc libm.so: matherr +# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign +# internally to allocate aligned TLS storage. The other malloc family of +# functions are expected to allow user symbol interposition. +ld.so: __tls_get_addr +ld.so: __libc_memalign +ld.so: malloc +ld.so: calloc +ld.so: realloc +ld.so: free