1 5984 jhaslam #!/bin/ksh -p 2 5984 jhaslam # 3 5984 jhaslam # CDDL HEADER START 4 5984 jhaslam # 5 5984 jhaslam # The contents of this file are subject to the terms of the 6 5984 jhaslam # Common Development and Distribution License (the "License"). 7 5984 jhaslam # You may not use this file except in compliance with the License. 8 5984 jhaslam # 9 5984 jhaslam # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 5984 jhaslam # or http://www.opensolaris.org/os/licensing. 11 5984 jhaslam # See the License for the specific language governing permissions 12 5984 jhaslam # and limitations under the License. 13 5984 jhaslam # 14 5984 jhaslam # When distributing Covered Code, include this CDDL HEADER in each 15 5984 jhaslam # file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 5984 jhaslam # If applicable, add the following below this CDDL HEADER, with the 17 5984 jhaslam # fields enclosed by brackets "[]" replaced with your own identifying 18 5984 jhaslam # information: Portions Copyright [yyyy] [name of copyright owner] 19 5984 jhaslam # 20 5984 jhaslam # CDDL HEADER END 21 5984 jhaslam # 22 5984 jhaslam 23 5984 jhaslam # 24 5984 jhaslam # Copyright 2008 Sun Microsystems, Inc. All rights reserved. 25 5984 jhaslam # Use is subject to license terms. 26 5984 jhaslam # 27 5984 jhaslam # ident "%Z%%M% %I% %E% SMI" 28 5984 jhaslam 29 5984 jhaslam # 30 5984 jhaslam # This test verifies that USDT probes will be picked up after a dlopen(3C) 31 5984 jhaslam # when a regex in the provider name matches both USDT probes and pid probes 32 5984 jhaslam # (e.g., p*d$target matches both pid$target and pyramid$target.) 33 5984 jhaslam # 34 5984 jhaslam 35 5984 jhaslam if [ $# != 1 ]; then 36 5984 jhaslam echo expected one argument: '<'dtrace-path'>' 37 5984 jhaslam exit 2 38 5984 jhaslam fi 39 5984 jhaslam 40 5984 jhaslam dtrace=$1 41 5984 jhaslam DIR=${TMPDIR:-/tmp}/dtest.$$ 42 5984 jhaslam 43 5984 jhaslam mkdir $DIR 44 5984 jhaslam cd $DIR 45 5984 jhaslam 46 5984 jhaslam cat > Makefile <<EOF 47 5984 jhaslam all: main altlib.so 48 5984 jhaslam 49 5984 jhaslam main: main.o provmain.o 50 5984 jhaslam cc -o main main.o provmain.o 51 5984 jhaslam 52 5984 jhaslam main.o: main.c prov.h 53 5984 jhaslam cc -c main.c 54 5984 jhaslam 55 5984 jhaslam prov.h: prov.d 56 5984 jhaslam $dtrace -h -s prov.d 57 5984 jhaslam 58 5984 jhaslam provmain.o: prov.d main.o 59 5984 jhaslam $dtrace -G -32 -o provmain.o -s prov.d main.o 60 5984 jhaslam 61 5984 jhaslam altlib.so: altlib.o provalt.o 62 5984 jhaslam cc -z defs -G -o altlib.so altlib.o provalt.o -lc 63 5984 jhaslam 64 5984 jhaslam altlib.o: altlib.c prov.h 65 5984 jhaslam cc -c altlib.c 66 5984 jhaslam 67 5984 jhaslam provalt.o: prov.d altlib.o 68 5984 jhaslam $dtrace -G -32 -o provalt.o -s prov.d altlib.o 69 5984 jhaslam EOF 70 5984 jhaslam 71 5984 jhaslam cat > prov.d <<EOF 72 5984 jhaslam provider pyramid { 73 5984 jhaslam probe entry(); 74 5984 jhaslam }; 75 5984 jhaslam EOF 76 5984 jhaslam 77 5984 jhaslam cat > altlib.c <<EOF 78 5984 jhaslam #include <sys/sdt.h> 79 5984 jhaslam #include "prov.h" 80 5984 jhaslam 81 5984 jhaslam void 82 5984 jhaslam go(void) 83 5984 jhaslam { 84 5984 jhaslam PYRAMID_ENTRY(); 85 5984 jhaslam } 86 5984 jhaslam EOF 87 5984 jhaslam 88 5984 jhaslam cat > main.c <<EOF 89 5984 jhaslam #include <dlfcn.h> 90 5984 jhaslam #include <unistd.h> 91 5984 jhaslam #include <stdio.h> 92 5984 jhaslam #include <sys/sdt.h> 93 5984 jhaslam #include "prov.h" 94 5984 jhaslam 95 5984 jhaslam void 96 5984 jhaslam go(void) 97 5984 jhaslam { 98 5984 jhaslam PYRAMID_ENTRY(); 99 5984 jhaslam } 100 5984 jhaslam 101 5984 jhaslam int 102 5984 jhaslam main(int argc, char **argv) 103 5984 jhaslam { 104 5984 jhaslam void *alt; 105 5984 jhaslam void *alt_go; 106 5984 jhaslam 107 5984 jhaslam go(); 108 5984 jhaslam 109 5984 jhaslam if ((alt = dlopen("./altlib.so", RTLD_LAZY | RTLD_LOCAL)) 110 5984 jhaslam == NULL) { 111 5984 jhaslam printf("dlopen of altlib.so failed: %s\n", dlerror()); 112 5984 jhaslam return (1); 113 5984 jhaslam } 114 5984 jhaslam 115 5984 jhaslam if ((alt_go = dlsym(alt, "go")) == NULL) { 116 5984 jhaslam printf("failed to lookup 'go' in altlib.so\n"); 117 5984 jhaslam return (1); 118 5984 jhaslam } 119 5984 jhaslam 120 5984 jhaslam ((void (*)(void))alt_go)(); 121 5984 jhaslam 122 5984 jhaslam return (0); 123 5984 jhaslam } 124 5984 jhaslam EOF 125 5984 jhaslam 126 5984 jhaslam make > /dev/null 127 5984 jhaslam if [ $? -ne 0 ]; then 128 5984 jhaslam print -u2 "failed to build" 129 5984 jhaslam exit 1 130 5984 jhaslam fi 131 5984 jhaslam 132 5984 jhaslam cat > main.d <<'EOF' 133 5984 jhaslam p*d$target::go:entry 134 5984 jhaslam { 135 5984 jhaslam @foo[probemod, probefunc, probename] = count(); 136 5984 jhaslam } 137 5984 jhaslam 138 5984 jhaslam END 139 5984 jhaslam { 140 5984 jhaslam printa("%s:%s:%s %@u\n",@foo); 141 5984 jhaslam } 142 5984 jhaslam EOF 143 5984 jhaslam 144 5984 jhaslam script() { 145 5984 jhaslam $dtrace -q -s ./main.d -c ./main 146 5984 jhaslam } 147 5984 jhaslam 148 5984 jhaslam script 149 5984 jhaslam status=$? 150 5984 jhaslam 151 5984 jhaslam cd /tmp 152 5984 jhaslam /usr/bin/rm -rf $DIR 153 5984 jhaslam 154 5984 jhaslam exit $status 155