diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-02-01 16:08:01 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-01 16:08:01 +0100 |
| commit | ce6c1484f8963cee8b793f010ad84ef7e94d2b91 (patch) | |
| tree | 9722a558d198b82f956432d1bf3992ceed5176f2 /src/test | |
| parent | 547f2ba06bc4aa93a375c54e1af3fd1216eeaf62 (diff) | |
| parent | 6a88311373bf18b272aed98d3032852cfcec4455 (diff) | |
Rollup merge of #86374 - bossmc:enable-static-pie-for-gnu, r=nagisa
Enable combining `+crt-static` and `relocation-model=pic` on `x86_64-unknown-linux-gnu` Modern `gcc` versions support `-static-pie`, and `rustc` will already fall-back to `-static` if the local `gcc` is too old (and hence this change is optimistic rather than absolute). This brings the `-musl` and `-gnu` targets to feature compatibility (albeit with different default settings). Of note a `-static` or `-static-pie` binary based on glibc that uses NSS-backed functions (`gethostbyname` or `getpwuid` etc.) need to have access to the `libnss_X.so.2` libraries and any of their dynamic dependencies. I wasn't sure about the `# only`/`# ignore` changes (I've not got a `gnux32` toolchain to test with hence not also enabling `-static-pie` there).
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/run-make/static-pie/Makefile | 25 | ||||
| -rwxr-xr-x | src/test/run-make/static-pie/check_clang_version.sh | 20 | ||||
| -rwxr-xr-x | src/test/run-make/static-pie/check_gcc_version.sh | 20 |
3 files changed, 54 insertions, 11 deletions
diff --git a/src/test/run-make/static-pie/Makefile b/src/test/run-make/static-pie/Makefile index 1d3cc821389..945ec1724ac 100644 --- a/src/test/run-make/static-pie/Makefile +++ b/src/test/run-make/static-pie/Makefile @@ -1,15 +1,18 @@ -include ../../run-make-fulldeps/tools.mk -# only-x86_64-unknown-linux-musl +# only-x86_64 +# only-linux +# ignore-gnux32 # How to manually run this -# $ ./x.py test --target x86_64-unknown-linux-musl src/test/run-make/static-pie - -all: - $(RUSTC) --target $(TARGET) -C target-feature=+crt-static test-aslr.rs - # Check that no dynamic interpreter is set - ! readelf -l $(call RUN_BINFILE,test-aslr) | $(CGREP) INTERP - # Check that we have a dynamic executable - readelf -l $(call RUN_BINFILE,test-aslr) | $(CGREP) DYNAMIC - # Check for address space layout randomization - $(call RUN,test-aslr) --test-aslr +# $ ./x.py test --target x86_64-unknown-linux-[musl,gnu] src/test/run-make/static-pie + +all: test-clang test-gcc + +test-%: + if ./check_$*_version.sh; then\ + ${RUSTC} -Clinker=$* -Clinker-flavor=gcc --target ${TARGET} -C target-feature=+crt-static test-aslr.rs; \ + ! readelf -l $(call RUN_BINFILE,test-aslr) | $(CGREP) INTERP; \ + readelf -l $(call RUN_BINFILE,test-aslr) | $(CGREP) DYNAMIC; \ + $(call RUN,test-aslr) --test-aslr; \ + fi diff --git a/src/test/run-make/static-pie/check_clang_version.sh b/src/test/run-make/static-pie/check_clang_version.sh new file mode 100755 index 00000000000..b8e97c3da7d --- /dev/null +++ b/src/test/run-make/static-pie/check_clang_version.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -euo pipefail + +if command -v clang > /dev/null +then + CLANG_VERSION=$(echo __clang_major__ | clang -E -x c - | grep -v -e '^#' ) + echo "clang version $CLANG_VERSION detected" + if (( $CLANG_VERSION >= 9 )) + then + echo "clang supports -static-pie" + exit 0 + else + echo "clang too old to support -static-pie, skipping test" + exit 1 + fi +else + echo "No clang version detected" + exit 2 +fi diff --git a/src/test/run-make/static-pie/check_gcc_version.sh b/src/test/run-make/static-pie/check_gcc_version.sh new file mode 100755 index 00000000000..d07e1d151df --- /dev/null +++ b/src/test/run-make/static-pie/check_gcc_version.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -euo pipefail + +if command -v gcc > /dev/null +then + GCC_VERSION=$(echo __GNUC__ | gcc -E -x c - | grep -v -e '^#' ) + echo "gcc version $GCC_VERSION detected" + if (( $GCC_VERSION >= 8 )) + then + echo "gcc supports -static-pie" + exit 0 + else + echo "gcc too old to support -static-pie, skipping test" + exit 1 + fi +else + echo "No gcc version detected" + exit 2 +fi |
