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 #
  25 unalias -a
  26 
  27 TESTDIR=$(dirname $0)
  28 
  29 sh_path=
  30 sh_lib="lib"
  31 sh_lib64="$sh_lib/64"
  32 sh_soname="libld.so.4"
  33 sh_cc="gcc"
  34 sh_cflags="-m32"
  35 sh_file="${TESTDIR}/link.c"
  36 sh_arg0=$(basename $0)
  37 
  38 function 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 #
  51 function 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 #
  65 function 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 
  78 sh_path=${1:-/}
  79 validate
  80 
  81 run "-Wl,-zassert-deflib" 0 \
  82     "Testing basic compilation succeeds with warnings..." \
  83     "failed to compile with warnings"
  84 
  85 run "-Wl,-zassert-deflib -Wl,-zfatal-warnings" 1 \
  86     "Testing basic compilation fails if warning are fatal..." \
  87     "linking succeeeded, expected failure"
  88 
  89 run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings" 0 \
  90     "Testing basic exception with fatal warnings..." \
  91     "linking failed despite exception"
  92 
  93 run "-Wl,-zassert-deflib=libc.so -Wl,-zfatal-warnings" 0 \
  94     "Testing basic exception with fatal warnings..." \
  95     "linking failed despite exception"
  96 
  97 
  98 run "-Wl,-zassert-deflib=lib.so -Wl,-zfatal-warnings" 1 \
  99     "Testing invalid library name..." \
 100     "ld should not allow invalid library name"
 101 
 102 run "-Wl,-zassert-deflib=libf -Wl,-zfatal-warnings" 1 \
 103     "Testing invalid library name..." \
 104     "ld should not allow invalid library name"
 105 
 106 run "-Wl,-zassert-deflib=libf.s -Wl,-zfatal-warnings" 1 \
 107     "Testing invalid library name..." \
 108     "ld should not allow invalid library name"
 109 
 110 run "-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 
 114 args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libelf.so"
 115 args="$args -Wl,-zfatal-warnings -lelf"
 116 
 117 run "$args" 0 \
 118     "Multiple exceptions work..." \
 119     "multiple exceptions don't work"
 120 
 121 args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libelfe.so"
 122 args="$args -Wl,-zfatal-warnings -lelf"
 123 
 124 run "$args" 1 \
 125     "Exceptions only catch the specific library" \
 126     "exceptions caught the wrong library"
 127 
 128 args="-Wl,-zassert-deflib=libc.so -Wl,-zassert-deflib=libel.so"
 129 args="$args -Wl,-zfatal-warnings -lelf"
 130 
 131 run "$args" 1 \
 132     "Exceptions only catch the specific library" \
 133     "exceptions caught the wrong library"
 134 
 135 echo "Tests passed."
 136 exit 0