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 27TESTDIR=$(dirname $0) 28 29sh_path= 30sh_lib="lib" 31sh_lib64="$sh_lib/64" 32sh_soname="libld.so.4" 33sh_cc="gcc" 34sh_cflags="-m32" 35sh_file="${TESTDIR}/link.c" 36sh_arg0=$(basename $0) 37 38function fatal 39{ 40 local msg="$*" 41 [[ -z "$msg" ]] && msg="failed" 42 echo "$sh_arg0: $msg" >&2 43 exit 1 44} 45 46 47# 48# Validate that everything we need is in our path. That includes having cc 49# and the proto area libld. 50# 51function validate 52{ 53 [[ -f $sh_path/$sh_lib/$sh_soname ]] || fatal "missing 32-bit $sh_soname" 54 [[ -f $sh_path/$sh_lib64/$sh_soname ]] || 55 fatal "missing 64-bit $sh_soname" 56 which $sh_cc >/dev/null || fatal "cc not in path" 57} 58 59# 60# $1 is a series of flags to append 61# $2 is expected exit status 62# $3 is pre-test message 63# $4 is the failure message 64# 65function run 66{ 67 local ret 68 69 echo $3 70 LD_LIBRARY_PATH_64="$sh_path/$sh_lib64" $sh_cc $sh_cflags $sh_file $1 71 if [[ $? -eq $2 ]]; then 72 printf "success\n\n" 73 else 74 fatal $4 75 fi 76} 77 78sh_path=${1:-/} 79validate 80 81run "-Wl,-zassert-deflib" 0 \ 82 "Testing basic compilation succeeds with warnings..." \ 83 "failed to compile with warnings" 84 85run "-Wl,-zassert-deflib -Wl,-zfatal-warnings" 1 \ 86 "Testing basic compilation fails if warning are fatal..." \ 87 "linking succeeeded, expected failure" 88 89run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings" 0 \ 90 "Testing basic exception with fatal warnings..." \ 91 "linking failed despite exception" 92 93run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings" 0 \ 94 "Testing basic exception with fatal warnings..." \ 95 "linking failed despite exception" 96 97 98run "-Wl,-zassert-deflib=lib.so -Wl,-zfatal-warnings" 1 \ 99 "Testing invalid library name..." \ 100 "ld should not allow invalid library name" 101 102run "-Wl,-zassert-deflib=libf -Wl,-zfatal-warnings" 1 \ 103 "Testing invalid library name..." \ 104 "ld should not allow invalid library name" 105 106run "-Wl,-zassert-deflib=libf.s -Wl,-zfatal-warnings" 1 \ 107 "Testing invalid library name..." \ 108 "ld should not allow invalid library name" 109 110run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings -lelf" 1 \ 111 "Errors even if one library is under exception path..." \ 112 "one exception shouldn't stop another" 113 114args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libelf.so" 115args="$args -Wl,-zfatal-warnings -lelf" 116 117run "$args" 0 \ 118 "Multiple exceptions work..." \ 119 "multiple exceptions don't work" 120 121args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libelfe.so" 122args="$args -Wl,-zfatal-warnings -lelf" 123 124run "$args" 1 \ 125 "Exceptions only catch the specific library" \ 126 "exceptions caught the wrong library" 127 128args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libel.so" 129args="$args -Wl,-zfatal-warnings -lelf" 130 131run "$args" 1 \ 132 "Exceptions only catch the specific library" \ 133 "exceptions caught the wrong library" 134 135echo "Tests passed." 136exit 0 137