summaryrefslogtreecommitdiff
path: root/usr/src/cmd/sgs/test/ld/assert-deflib/test-deflib.sh
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/sgs/test/ld/assert-deflib/test-deflib.sh')
-rw-r--r--usr/src/cmd/sgs/test/ld/assert-deflib/test-deflib.sh135
1 files changed, 135 insertions, 0 deletions
diff --git a/usr/src/cmd/sgs/test/ld/assert-deflib/test-deflib.sh b/usr/src/cmd/sgs/test/ld/assert-deflib/test-deflib.sh
new file mode 100644
index 0000000000..cf07c35788
--- /dev/null
+++ b/usr/src/cmd/sgs/test/ld/assert-deflib/test-deflib.sh
@@ -0,0 +1,135 @@
+#!/bin/bash
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2012, Joyent, Inc.
+#
+
+#
+# This test validates that the -zassert-deflib option of ld(1) works correctly.
+# It requires that some cc is in your path and that you have passed in the path
+# to the proto area with the new version of libld.so.4. One thing that we have
+# to do is be careful with using LD_LIBRARY_PATH. Setting LD_LIBRARY_PATH does
+# not change the default search path so we want to make sure that we use a
+# different ISA (e.g. 32-bit vs 64-bit) from the binary we're generating.
+#
+unalias -a
+
+sh_path=
+sh_lib="lib"
+sh_lib64="$sh_lib/64"
+sh_soname="libld.so.4"
+sh_cc="cc"
+sh_cflags="-m32"
+sh_file="link.c"
+sh_arg0=$(basename $0)
+
+function fatal
+{
+ local msg="$*"
+ [[ -z "$msg" ]] && msg="failed"
+ echo "$sh_arg0: $msg" >&2
+ exit 1
+}
+
+
+#
+# Validate that everything we need is in our path. That includes having cc
+# and the proto area libld.
+#
+function validate
+{
+ [[ -f $sh_path/$sh_lib/$sh_soname ]] || fatal "missing 32-bit $sh_soname"
+ [[ -f $sh_path/$sh_lib64/$sh_soname ]] ||
+ fatal "missing 64-bit $sh_soname"
+ which $sh_cc >/dev/null || fatal "cc not in path"
+}
+
+#
+# $1 is a series of flags to append
+# $2 is expected exit status
+# $3 is pre-test message
+# $4 is the failure message
+#
+function run
+{
+ local ret
+
+ echo $3
+ LD_LIBRARY_PATH_64="$sh_path/$sh_lib64" $sh_cc $sh_cflags $sh_file $1
+ if [[ $? -eq $2 ]]; then
+ printf "success\n\n"
+ else
+ fatal $4
+ fi
+}
+
+sh_path=$1
+[[ -z "$1" ]] && fatal "<proto root>"
+validate
+
+run "-Wl,-zassert-deflib" 0 \
+ "Testing basic compilation succeeds with warnings..." \
+ "failed to compile with warnings"
+
+run "-Wl,-zassert-deflib -Wl,-zfatal-warnings" 1 \
+ "Testing basic compilation fails if warning are fatal..." \
+ "linking succeeeded, expected failure"
+
+run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings" 0 \
+ "Testing basic exception with fatal warnings..." \
+ "linking failed despite exception"
+
+run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings" 0 \
+ "Testing basic exception with fatal warnings..." \
+ "linking failed despite exception"
+
+
+run "-Wl,-zassert-deflib=lib.so -Wl,-zfatal-warnings" 1 \
+ "Testing invalid library name..." \
+ "ld should not allow invalid library name"
+
+run "-Wl,-zassert-deflib=libf -Wl,-zfatal-warnings" 1 \
+ "Testing invalid library name..." \
+ "ld should not allow invalid library name"
+
+run "-Wl,-zassert-deflib=libf.s -Wl,-zfatal-warnings" 1 \
+ "Testing invalid library name..." \
+ "ld should not allow invalid library name"
+
+run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings -lelf" 1 \
+ "Errors even if one library is under exception path..." \
+ "one exception shouldn't stop another"
+
+args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libelf.so"
+args="$args -Wl,-zfatal-warnings -lelf"
+
+run "$args" 0 \
+ "Multiple exceptions work..." \
+ "multiple exceptions don't work"
+
+args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libelfe.so"
+args="$args -Wl,-zfatal-warnings -lelf"
+
+run "$args" 1 \
+ "Exceptions only catch the specific library" \
+ "exceptions caught the wrong library"
+
+args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libel.so"
+args="$args -Wl,-zfatal-warnings -lelf"
+
+run "$args" 1 \
+ "Exceptions only catch the specific library" \
+ "exceptions caught the wrong library"
+
+echo "Tests passed."
+exit 0