1 #! /usr/bin/ksh
   2 #
   3 #
   4 # This file and its contents are supplied under the terms of the
   5 # Common Development and Distribution License ("CDDL"), version 1.0.
   6 # You may only use this file in accordance with the terms of version
   7 # 1.0 of the CDDL.
   8 #
   9 # A full copy of the text of the CDDL should have accompanied this
  10 # source.  A copy of the CDDL is also available via the Internet at
  11 # http://www.illumos.org/license/CDDL.
  12 #
  13 
  14 # Copyright 2015, Richard Lowe.
  15 
  16 tmpdir=/tmp/test.$$
  17 mkdir $tmpdir
  18 cd $tmpdir
  19 
  20 cleanup() {
  21     cd /
  22     rm -fr $tmpdir
  23 }
  24 
  25 trap 'cleanup' EXIT
  26 
  27 cat > tester.c <<EOF
  28 #include <stdio.h>
  29 #include <unistd.h>
  30 
  31 int
  32 main(int argc, char **argv)
  33 {
  34         sleep(10000);
  35         return (0);
  36 }
  37 EOF
  38 
  39 gcc -o tester-aslr tester.c -Wl,-z,aslr=enabled
  40 gcc -o tester-noaslr tester.c -Wl,-z,aslr=disabled
  41 
  42 # This is the easiest way I've found to get many many DTs, but it's gross
  43 gcc -o many-dts-aslr tester.c -Wl,-z,aslr=enabled $(for elt in /usr/lib/lib*.so; do echo -Wl,-N,$(basename $elt); done)
  44 gcc -o many-dts-noaslr tester.c -Wl,-z,aslr=disabled $(for elt in /usr/lib/lib*.so; do echo -Wl,-N,$(basename $elt); done)
  45 
  46 check() {
  47     bin=$1
  48     state=$2
  49     ret=0
  50 
  51     $bin &
  52     pid=$!
  53     psecflags $pid | grep -q 'E:.*aslr'
  54     (( $? != $state )) && ret=1
  55     kill -9 $pid
  56     return $ret
  57 }
  58 
  59 fail() {
  60     echo $@
  61     exit 1
  62 }
  63 
  64 psecflags -s none $$
  65 check ./tester-aslr 0 || fail "DT_SUNW_ASLR 1 failed"
  66 check ./many-dts-aslr 0 || fail "DT_SUNW_ASLR 1 with many DTs failed"
  67 
  68 psecflags -s aslr $$
  69 check ./tester-noaslr 1 || fail "DT_SUNW_ASLR 0 failed"
  70 check ./many-dts-noaslr 1 || fail "DT_SUNW_ASLR 0 with many DTs failed"
  71