16e0bee74Sjhaslam#!/bin/ksh -p 26e0bee74Sjhaslam# 36e0bee74Sjhaslam# CDDL HEADER START 46e0bee74Sjhaslam# 56e0bee74Sjhaslam# The contents of this file are subject to the terms of the 66e0bee74Sjhaslam# Common Development and Distribution License (the "License"). 76e0bee74Sjhaslam# You may not use this file except in compliance with the License. 86e0bee74Sjhaslam# 96e0bee74Sjhaslam# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 106e0bee74Sjhaslam# or http://www.opensolaris.org/os/licensing. 116e0bee74Sjhaslam# See the License for the specific language governing permissions 126e0bee74Sjhaslam# and limitations under the License. 136e0bee74Sjhaslam# 146e0bee74Sjhaslam# When distributing Covered Code, include this CDDL HEADER in each 156e0bee74Sjhaslam# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 166e0bee74Sjhaslam# If applicable, add the following below this CDDL HEADER, with the 176e0bee74Sjhaslam# fields enclosed by brackets "[]" replaced with your own identifying 186e0bee74Sjhaslam# information: Portions Copyright [yyyy] [name of copyright owner] 196e0bee74Sjhaslam# 206e0bee74Sjhaslam# CDDL HEADER END 216e0bee74Sjhaslam# 226e0bee74Sjhaslam 236e0bee74Sjhaslam# 246e0bee74Sjhaslam# Copyright 2008 Sun Microsystems, Inc. All rights reserved. 256e0bee74Sjhaslam# Use is subject to license terms. 266e0bee74Sjhaslam# 276e0bee74Sjhaslam 286e0bee74Sjhaslam# 296e0bee74Sjhaslam# This test verifies that probes will be picked up after a dlopen(3C) 306e0bee74Sjhaslam# when the pid provider is specified as a glob (e.g., p*d$target.) 316e0bee74Sjhaslam# 326e0bee74Sjhaslam 336e0bee74Sjhaslamif [ $# != 1 ]; then 346e0bee74Sjhaslam echo expected one argument: '<'dtrace-path'>' 356e0bee74Sjhaslam exit 2 366e0bee74Sjhaslamfi 376e0bee74Sjhaslam 386e0bee74Sjhaslamdtrace=$1 396e0bee74SjhaslamDIR=${TMPDIR:-/tmp}/dtest.$$ 406e0bee74Sjhaslam 416e0bee74Sjhaslammkdir $DIR 426e0bee74Sjhaslamcd $DIR 436e0bee74Sjhaslam 446e0bee74Sjhaslamcat > Makefile <<EOF 456e0bee74Sjhaslamall: main altlib.so 466e0bee74Sjhaslam 476e0bee74Sjhaslammain: main.o 48*a386cc11SRobert Mustacchi gcc -m32 -o main main.o 496e0bee74Sjhaslam 506e0bee74Sjhaslammain.o: main.c 51*a386cc11SRobert Mustacchi gcc -m32 -c main.c 526e0bee74Sjhaslam 536e0bee74Sjhaslamaltlib.so: altlib.o 54*a386cc11SRobert Mustacchi gcc -m32 -shared -o altlib.so altlib.o -lc 556e0bee74Sjhaslam 566e0bee74Sjhaslamaltlib.o: altlib.c 57*a386cc11SRobert Mustacchi gcc -m32 -fPIC -c altlib.c 586e0bee74SjhaslamEOF 596e0bee74Sjhaslam 606e0bee74Sjhaslamcat > altlib.c <<EOF 616e0bee74Sjhaslamvoid 626e0bee74Sjhaslamgo(void) 636e0bee74Sjhaslam{ 646e0bee74Sjhaslam} 656e0bee74SjhaslamEOF 666e0bee74Sjhaslam 676e0bee74Sjhaslamcat > main.c <<EOF 686e0bee74Sjhaslam#include <dlfcn.h> 696e0bee74Sjhaslam#include <unistd.h> 706e0bee74Sjhaslam#include <stdio.h> 716e0bee74Sjhaslam 726e0bee74Sjhaslamvoid 736e0bee74Sjhaslamgo(void) 746e0bee74Sjhaslam{ 756e0bee74Sjhaslam} 766e0bee74Sjhaslam 776e0bee74Sjhaslamint 786e0bee74Sjhaslammain(int argc, char **argv) 796e0bee74Sjhaslam{ 806e0bee74Sjhaslam void *alt; 816e0bee74Sjhaslam void *alt_go; 826e0bee74Sjhaslam 836e0bee74Sjhaslam go(); 846e0bee74Sjhaslam 856e0bee74Sjhaslam if ((alt = dlopen("./altlib.so", RTLD_LAZY | RTLD_LOCAL)) 866e0bee74Sjhaslam == NULL) { 876e0bee74Sjhaslam printf("dlopen of altlib.so failed: %s\n", dlerror()); 886e0bee74Sjhaslam return (1); 896e0bee74Sjhaslam } 906e0bee74Sjhaslam 916e0bee74Sjhaslam if ((alt_go = dlsym(alt, "go")) == NULL) { 926e0bee74Sjhaslam printf("failed to lookup 'go' in altlib.so\n"); 936e0bee74Sjhaslam return (1); 946e0bee74Sjhaslam } 956e0bee74Sjhaslam 966e0bee74Sjhaslam ((void (*)(void))alt_go)(); 976e0bee74Sjhaslam 986e0bee74Sjhaslam return (0); 996e0bee74Sjhaslam} 1006e0bee74SjhaslamEOF 1016e0bee74Sjhaslam 1026e0bee74Sjhaslammake > /dev/null 1036e0bee74Sjhaslamif [ $? -ne 0 ]; then 1046e0bee74Sjhaslam print -u2 "failed to build" 1056e0bee74Sjhaslam exit 1 1066e0bee74Sjhaslamfi 1076e0bee74Sjhaslam 1086e0bee74Sjhaslamcat > main.d <<'EOF' 1096e0bee74Sjhaslamp*d$target::go:entry 1106e0bee74Sjhaslam{ 1116e0bee74Sjhaslam @foo[probemod, probefunc, probename] = count(); 1126e0bee74Sjhaslam} 1136e0bee74Sjhaslam 1146e0bee74SjhaslamEND 1156e0bee74Sjhaslam{ 1166e0bee74Sjhaslam printa("%s:%s:%s %@u\n",@foo); 1176e0bee74Sjhaslam} 1186e0bee74SjhaslamEOF 1196e0bee74Sjhaslam 1206e0bee74Sjhaslamscript() { 1216e0bee74Sjhaslam $dtrace -q -s ./main.d -c ./main 1226e0bee74Sjhaslam} 1236e0bee74Sjhaslam 1246e0bee74Sjhaslamscript 1256e0bee74Sjhaslamstatus=$? 1266e0bee74Sjhaslam 1276e0bee74Sjhaslamcd /tmp 1286e0bee74Sjhaslam/usr/bin/rm -rf $DIR 1296e0bee74Sjhaslam 1306e0bee74Sjhaslamexit $status 131