aboutsummaryrefslogtreecommitdiffstats
path: root/testing/rust/check-rustc
diff options
context:
space:
mode:
Diffstat (limited to 'testing/rust/check-rustc')
-rwxr-xr-xtesting/rust/check-rustc88
1 files changed, 88 insertions, 0 deletions
diff --git a/testing/rust/check-rustc b/testing/rust/check-rustc
new file mode 100755
index 0000000000..015730dc0e
--- /dev/null
+++ b/testing/rust/check-rustc
@@ -0,0 +1,88 @@
+#!/bin/sh
+set -eu
+
+RUSTC="$1"
+TMPDIR="$(pwd)/.tmp-${0##*/}-$RANDOM"
+failed=0
+
+
+_rustc() {
+ printf '\n$ rustc %s\n' "$*"
+ "$RUSTC" "$@"
+}
+
+die() {
+ printf '\033[1;31mERROR:\033[0m %s\n' "$1" >&2 # bold red
+ exit 1
+}
+
+fail() {
+ printf '\033[1;31mFAIL:\033[0m %s\n' "$1" >&2 # bold red
+ failed=$(( failed + 1 ))
+}
+
+# Checks if the given file is a statically linked binary.
+is_static() {
+ ! readelf -l "$1" | grep -Fq INTERP \
+ && ! readelf -d "$1" | grep -Fq NEEDED
+}
+
+assert_dynamic() {
+ test -f "$1" && ! is_static "$1" || {
+ fail "$1 is not a dynamic executable!"
+ readelf -ld "$1"
+ }
+}
+
+assert_ok() {
+ "$1" || fail "$1 exited with status $?"
+}
+
+assert_pie() {
+ readelf -d "$1" | grep FLAGS_1 | grep -q PIE || {
+ fail "$1 is not a PIE executable!"
+ readelf -d "$1"
+ }
+}
+
+assert_static() {
+ test -f "$1" && is_static "$1" || {
+ fail "$1 is not a static executable!"
+ readelf -ld "$1"
+ }
+}
+
+
+#-------------------- M a i n --------------------
+
+test -d "$TMPDIR" && die "$TMPDIR already exists!"
+mkdir -p "$TMPDIR"
+trap "rm -R '$TMPDIR'" EXIT
+
+cd "$TMPDIR"
+
+cat >> hello_world.rs <<-EOF
+ fn main() {
+ println!("Hello, world!");
+ }
+EOF
+
+_rustc hello_world.rs
+assert_ok ./hello_world
+assert_static hello_world
+assert_pie hello_world
+rm -f hello_world
+
+_rustc -C target-feature=-crt-static hello_world.rs
+assert_ok ./hello_world
+assert_dynamic hello_world
+assert_pie hello_world
+rm -f hello_world
+
+_rustc -C target-feature=+crt-static hello_world.rs
+assert_ok ./hello_world
+assert_static hello_world
+assert_pie hello_world
+rm -f hello_world
+
+[ "$failed" -eq 0 ] || die "$failed assertion(s) has failed"