From: Stefan Liebler <stli@linux.ibm.com>
To: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>,
libc-alpha@sourceware.org
Subject: Re: [PATCH v2] S390: Always enable static PIE if build with lld.
Date: Tue, 27 Feb 2024 16:36:43 +0100 [thread overview]
Message-ID: <2bc3a7fd-9d9b-4d55-a291-1bb6883ae08c@linux.ibm.com> (raw)
In-Reply-To: <a93469b0-0fc8-4694-ab86-f7e6ccf51d09@linaro.org>
On 27.02.24 14:49, Adhemerval Zanella Netto wrote:
>
>
> On 26/02/24 11:32, Stefan Liebler wrote:
>> On 23.02.24 15:48, Adhemerval Zanella Netto wrote:
>>>
>>>
>>> On 21/02/24 11:56, Stefan Liebler wrote:
>>>
>>> Sorry, but all the PIE tests on s390x are overcomplicated and brittle. The version
>>> check is really unecessary and I think we should move away from it, instead check
>>> for either linker support and resulting relocations on generated code.
>>>
>>> The gold supports could be just filtered out by using -Wl,--no-dynamic-linker on
>> Yes, when linking with "gcc -static-pie", gcc automatically adds
>> --no-dynamic-linker and thus "-Wl,--no-dynamic-linker" can be added to
>> the -pie check.
>
> Indeed, I think all supported gcc version add --no-dynamic-linker for --static-pie.
>
>>
>>> the -pie check. Also, the relocation check does not seem correct: at least
>>> with binutils 2.36 ld generates R_390_TLS_DTPMOD/R_390_TLS_DTPOFF for the
>>> 'foo' access.
>> Interesting. I don't see R_390_TLS_DTPMOD/R_390_TLS_DTPOFF with binutils
>> 2.36, but:
>> - conftest1.o
>> 000000000000 000a00000033 R_390_TLS_LE64 0000000000000000 foo + 0
>> - conftest2.o
>> 00000000000a 000a00000031 R_390_TLS_IEENT 0000000000000000 foo + 2
>> - conftest
>> 000000001fe8 000800000038 R_390_TLS_TPOFF 0000000000000000 foo + 0
>>
>> Can you please have a further look how the
>> R_390_TLS_DTPMOD/R_390_TLS_DTPOFF were generated?
>
> This was from the startup/standard library, the R_390_TLS_TPOFF is indeed
> the correct relocation to check.
>
>>>
>>> So I think we should use something as the below. The libc_cv_s390x_staticpie_req_runtime
>>> is correctly set for old binutils and lld version 17, while being true for recent
>>> binutils and lld version 18+. I also think all the comments of the requirement
>>> are confusing and does not help much (it also references others ABI, like i386
>>> and ia64 which is not straightforward to understand why it matter for s390x),
>>> so I would recommend to just remove them altogether.
>> But, if you are bootstrapping the toolchain, then you don't have
>> crt-files and the linking -pie check fails. Then you don't get static
>> pie support and no rcrt1.o file.
>> This is e.g. the case for the Ubuntu libc6-dev-s390x-cross package.
>>
>> You also see it with build-many-glibcs.py script. Note that there glibc
>> configure is called twice:
>> -
>> logs/compilers/s390x-linux-gnu/026-compilers-s390x-linux-gnu-glibc-s390-linux-gnu-configure-log.txt
>> => called with empty sysroot. The following make install creates
>> crt-files in the sysroot folder. Currently rcrt1.o is created. Without
>> the version check, it would not be created.
>>
>> - logs/glibcs/s390x-linux-gnu/003-glibcs-s390x-linux-gnu-configure-log.txt
>
> You are right, we need to follow what loongarch and riscv does and use
> -nostartfiles -nostdlib. Something like:
>
This solves the bootstrapping-case and the test is independent of used
binutils/lld/gold linker. Then the version check is not needed anymore.
As this is your effort, do you want to continue with this patch?
Thanks a lot,
Stefan
> diff --git a/sysdeps/s390/s390-64/configure.ac b/sysdeps/s390/s390-64/configure.ac
> index 4657de0d37..a8849599b8 100644
> --- a/sysdeps/s390/s390-64/configure.ac
> +++ b/sysdeps/s390/s390-64/configure.ac
> @@ -1,34 +1,6 @@
> GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
> # Local configure fragment for sysdeps/s390/s390-64.
>
> -# Bypass result of runtime configure check for known linker versions as
> -# e.g. crt-files or libc.so might not be available in bootstrapping
> -# environments.
> -case $($LD --version) in
> - "GNU gold"*)
> - # As of 2023-08-07, gold does not support static PIE due to
> - # Bug 22221 - add --no-dynamic-linker option
> - # https://sourceware.org/bugzilla/show_bug.cgi?id=22221
> - libc_cv_s390x_staticpie_req_version=no
> - ;;
> - "LLD"*)
> - # As of 2023-08-07, there is no lld which supports s390x.
> - libc_cv_s390x_staticpie_req_version=no
> - ;;
> - *)
> - # The required binutils patches are available with bintuils 2.39
> - libc_cv_s390x_staticpie_req_version=yes
> - # Skip AC_CHECK_PROGS and just use the result from main configure.ac.
> - libc_cv_s390x_staticpie_req_LD=$LD
> - AC_CHECK_PROG_VER(libc_cv_s390x_staticpie_req_LD, $LD, --version,
> - [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)],
> - [2.1[0-9][0-9]*|2.39*|2.[4-9][0-9]*|[3-9].*|[1-9][0-9]*],
> - libc_cv_s390x_staticpie_req_version=no)
> - ;;
> -esac
> -AC_MSG_CHECKING([for s390-specific static PIE requirements (version check)])
> -AC_MSG_RESULT($libc_cv_s390x_staticpie_req_version)
> -
> # Minimal checking for static PIE support in ld.
> # Compare to ld testcase/bugzilla:
> # <binutils-source>/ld/testsuite/ld-elf/pr22263-1.rd
> @@ -58,15 +30,14 @@ EOF
> libc_cv_s390x_staticpie_req_runtime=no
> if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest1.c -o conftest1.o]) \
> && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -fPIE -c conftest2.c -o conftest2.o]) \
> - && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -pie -o conftest conftest1.o conftest2.o]) \
> + && AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostartfiles -nostdlib -fPIE -o conftest conftest1.o conftest2.o]) \
> && AC_TRY_COMMAND([! LC_ALL=C $READELF -Wr conftest | grep R_390_TLS_TPOFF])
> then
> libc_cv_s390x_staticpie_req_runtime=yes
> fi
> rm -rf conftest.*])
>
> -if test $libc_cv_s390x_staticpie_req_runtime = yes \
> - || test $libc_cv_s390x_staticpie_req_version = yes; then
> +if test $libc_cv_s390x_staticpie_req_runtime = yes; then
> # Static PIE is supported only on 64bit.
> # Ensure you also have those patches for:
> # - binutils (ld)
next prev parent reply other threads:[~2024-02-27 15:36 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-21 14:56 Stefan Liebler
2024-02-23 14:48 ` Adhemerval Zanella Netto
2024-02-26 14:32 ` Stefan Liebler
2024-02-27 13:49 ` Adhemerval Zanella Netto
2024-02-27 15:36 ` Stefan Liebler [this message]
2024-02-27 15:52 ` Adhemerval Zanella Netto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2bc3a7fd-9d9b-4d55-a291-1bb6883ae08c@linux.ibm.com \
--to=stli@linux.ibm.com \
--cc=adhemerval.zanella@linaro.org \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).