xref: /titanic_44/usr/src/cmd/sgs/test/ld/assert-deflib/test-deflib.sh (revision a60349c89adffc0902b2353230891d8e7f2b24d9)
1#!/bin/bash
2#
3# This file and its contents are supplied under the terms of the
4# Common Development and Distribution License ("CDDL"), version 1.0.
5# You may only use this file in accordance with the terms of version
6# 1.0 of the CDDL.
7#
8# A full copy of the text of the CDDL should have accompanied this
9# source.  A copy of the CDDL is also available via the Internet at
10# http://www.illumos.org/license/CDDL.
11#
12
13#
14# Copyright (c) 2012, Joyent, Inc.
15#
16
17#
18# This test validates that the -zassert-deflib option of ld(1) works correctly.
19# It requires that some cc is in your path and that you have passed in the path
20# to the proto area with the new version of libld.so.4. One thing that we have
21# to do is be careful with using LD_LIBRARY_PATH. Setting LD_LIBRARY_PATH does
22# not change the default search path so we want to make sure that we use a
23# different ISA (e.g. 32-bit vs 64-bit) from the binary we're generating.
24#
25unalias -a
26
27sh_path=
28sh_lib="lib"
29sh_lib64="$sh_lib/64"
30sh_soname="libld.so.4"
31sh_cc="cc"
32sh_cflags="-m32"
33sh_file="link.c"
34sh_arg0=$(basename $0)
35
36function fatal
37{
38        local msg="$*"
39        [[ -z "$msg" ]] && msg="failed"
40        echo "$sh_arg0: $msg" >&2
41        exit 1
42}
43
44
45#
46# Validate that everything we need is in our path. That includes having cc
47# and the proto area libld.
48#
49function validate
50{
51	[[ -f $sh_path/$sh_lib/$sh_soname ]] || fatal "missing 32-bit $sh_soname"
52	[[ -f $sh_path/$sh_lib64/$sh_soname ]] ||
53	    fatal "missing 64-bit $sh_soname"
54	which $sh_cc >/dev/null || fatal "cc not in path"
55}
56
57#
58# $1 is a series of flags to append
59# $2 is expected exit status
60# $3 is pre-test message
61# $4 is the failure message
62#
63function run
64{
65	local ret
66
67	echo $3
68	LD_LIBRARY_PATH_64="$sh_path/$sh_lib64" $sh_cc $sh_cflags $sh_file $1
69	if [[ $? -eq $2 ]]; then
70		printf "success\n\n"
71	else
72		fatal $4
73	fi
74}
75
76sh_path=$1
77[[ -z "$1" ]] && fatal "<proto root>"
78validate
79
80run "-Wl,-zassert-deflib" 0 \
81    "Testing basic compilation succeeds with warnings..." \
82    "failed to compile with warnings"
83
84run "-Wl,-zassert-deflib -Wl,-zfatal-warnings" 1 \
85    "Testing basic compilation fails if warning are fatal..." \
86    "linking succeeeded, expected failure"
87
88run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings" 0 \
89    "Testing basic exception with fatal warnings..." \
90    "linking failed despite exception"
91
92run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings" 0 \
93    "Testing basic exception with fatal warnings..." \
94    "linking failed despite exception"
95
96
97run "-Wl,-zassert-deflib=lib.so -Wl,-zfatal-warnings" 1 \
98    "Testing invalid library name..." \
99    "ld should not allow invalid library name"
100
101run "-Wl,-zassert-deflib=libf -Wl,-zfatal-warnings" 1 \
102    "Testing invalid library name..." \
103    "ld should not allow invalid library name"
104
105run "-Wl,-zassert-deflib=libf.s -Wl,-zfatal-warnings" 1 \
106    "Testing invalid library name..." \
107    "ld should not allow invalid library name"
108
109run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings -lelf" 1 \
110    "Errors even if one library is under exception path..." \
111    "one exception shouldn't stop another"
112
113args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libelf.so"
114args="$args -Wl,-zfatal-warnings -lelf"
115
116run "$args" 0 \
117    "Multiple exceptions work..." \
118    "multiple exceptions don't work"
119
120args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libelfe.so"
121args="$args -Wl,-zfatal-warnings -lelf"
122
123run "$args" 1 \
124    "Exceptions only catch the specific library" \
125    "exceptions caught the wrong library"
126
127args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libel.so"
128args="$args -Wl,-zfatal-warnings -lelf"
129
130run "$args" 1 \
131    "Exceptions only catch the specific library" \
132    "exceptions caught the wrong library"
133
134echo "Tests passed."
135exit 0
136