1038dc6b3Sahl#!/bin/ksh -p 2038dc6b3Sahl# 3038dc6b3Sahl# CDDL HEADER START 4038dc6b3Sahl# 5038dc6b3Sahl# The contents of this file are subject to the terms of the 6038dc6b3Sahl# Common Development and Distribution License (the "License"). 7038dc6b3Sahl# You may not use this file except in compliance with the License. 8038dc6b3Sahl# 9038dc6b3Sahl# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10038dc6b3Sahl# or http://www.opensolaris.org/os/licensing. 11038dc6b3Sahl# See the License for the specific language governing permissions 12038dc6b3Sahl# and limitations under the License. 13038dc6b3Sahl# 14038dc6b3Sahl# When distributing Covered Code, include this CDDL HEADER in each 15038dc6b3Sahl# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16038dc6b3Sahl# If applicable, add the following below this CDDL HEADER, with the 17038dc6b3Sahl# fields enclosed by brackets "[]" replaced with your own identifying 18038dc6b3Sahl# information: Portions Copyright [yyyy] [name of copyright owner] 19038dc6b3Sahl# 20038dc6b3Sahl# CDDL HEADER END 21038dc6b3Sahl# 22038dc6b3Sahl 23038dc6b3Sahl# 24038dc6b3Sahl# Copyright 2007 Sun Microsystems, Inc. All rights reserved. 25038dc6b3Sahl# Use is subject to license terms. 26038dc6b3Sahl# 27038dc6b3Sahl 28038dc6b3Sahl# 29038dc6b3Sahl# This test verifies that performing a dlclose(3dl) on a library doesn't 30038dc6b3Sahl# cause existing pid provider probes to become invalid. 31038dc6b3Sahl# 32038dc6b3Sahl 33038dc6b3Sahlif [ $# != 1 ]; then 34038dc6b3Sahl echo expected one argument: '<'dtrace-path'>' 35038dc6b3Sahl exit 2 36038dc6b3Sahlfi 37038dc6b3Sahl 38038dc6b3Sahldtrace=$1 39038dc6b3SahlDIR=/var/tmp/dtest.$$ 40038dc6b3Sahl 41038dc6b3Sahlmkdir $DIR 42038dc6b3Sahlcd $DIR 43038dc6b3Sahl 44038dc6b3Sahlcat > Makefile <<EOF 45038dc6b3Sahlall: main livelib.so deadlib.so 46038dc6b3Sahl 47038dc6b3Sahlmain: main.o prov.o 48*a386cc11SRobert Mustacchi gcc -m32 -o main main.o 49038dc6b3Sahl 50038dc6b3Sahlmain.o: main.c 51*a386cc11SRobert Mustacchi gcc -m32 -c main.c 52038dc6b3Sahl 53038dc6b3Sahl 54038dc6b3Sahllivelib.so: livelib.o prov.o 55*a386cc11SRobert Mustacchi gcc -m32 -shared -o livelib.so livelib.o prov.o -lc 56038dc6b3Sahl 57038dc6b3Sahllivelib.o: livelib.c prov.h 58*a386cc11SRobert Mustacchi gcc -m32 -fPIC -c livelib.c 59038dc6b3Sahl 60038dc6b3Sahlprov.o: livelib.o prov.d 61038dc6b3Sahl $dtrace -G -s prov.d livelib.o 62038dc6b3Sahl 63038dc6b3Sahlprov.h: prov.d 64038dc6b3Sahl $dtrace -h -s prov.d 65038dc6b3Sahl 66038dc6b3Sahl 67038dc6b3Sahldeadlib.so: deadlib.o 68*a386cc11SRobert Mustacchi gcc -m32 -shared -o deadlib.so deadlib.o -lc 69038dc6b3Sahl 70038dc6b3Sahldeadlib.o: deadlib.c 71*a386cc11SRobert Mustacchi gcc -m32 -fPIC -c deadlib.c 72038dc6b3Sahl 73038dc6b3Sahlclean: 74038dc6b3Sahl rm -f main.o livelib.o prov.o prov.h deadlib.o 75038dc6b3Sahl 76038dc6b3Sahlclobber: clean 77038dc6b3Sahl rm -f main livelib.so deadlib.so 78038dc6b3SahlEOF 79038dc6b3Sahl 80038dc6b3Sahlcat > prov.d <<EOF 81038dc6b3Sahlprovider test_prov { 82038dc6b3Sahl probe go(); 83038dc6b3Sahl}; 84038dc6b3SahlEOF 85038dc6b3Sahl 86038dc6b3Sahlcat > livelib.c <<EOF 87038dc6b3Sahl#include "prov.h" 88038dc6b3Sahl 89038dc6b3Sahlvoid 90038dc6b3Sahlgo(void) 91038dc6b3Sahl{ 92038dc6b3Sahl TEST_PROV_GO(); 93038dc6b3Sahl} 94038dc6b3SahlEOF 95038dc6b3Sahl 96038dc6b3Sahlcat > deadlib.c <<EOF 97038dc6b3Sahlvoid 98038dc6b3Sahlgo(void) 99038dc6b3Sahl{ 100038dc6b3Sahl} 101038dc6b3SahlEOF 102038dc6b3Sahl 103038dc6b3Sahl 104038dc6b3Sahlcat > main.c <<EOF 105038dc6b3Sahl#include <dlfcn.h> 106038dc6b3Sahl#include <unistd.h> 107038dc6b3Sahl#include <stdio.h> 108038dc6b3Sahl 109038dc6b3Sahlstatic void 110038dc6b3Sahlfoo(void) 111038dc6b3Sahl{ 112038dc6b3Sahl (void) close(-1); 113038dc6b3Sahl} 114038dc6b3Sahl 115038dc6b3Sahlint 116038dc6b3Sahlmain(int argc, char **argv) 117038dc6b3Sahl{ 118038dc6b3Sahl void *live; 119038dc6b3Sahl 120038dc6b3Sahl if ((live = dlopen("./livelib.so", RTLD_LAZY | RTLD_LOCAL)) == NULL) { 121038dc6b3Sahl printf("dlopen of livelib.so failed: %s\n", dlerror()); 122038dc6b3Sahl return (1); 123038dc6b3Sahl } 124038dc6b3Sahl 125038dc6b3Sahl (void) dlclose(live); 126038dc6b3Sahl 127038dc6b3Sahl foo(); 128038dc6b3Sahl 129038dc6b3Sahl return (0); 130038dc6b3Sahl} 131038dc6b3SahlEOF 132038dc6b3Sahl 133c090e5dfSBryan Cantrillmake > /dev/null 134038dc6b3Sahlif [ $? -ne 0 ]; then 135038dc6b3Sahl print -u2 "failed to build" 136038dc6b3Sahl exit 1 137038dc6b3Sahlfi 138038dc6b3Sahl 139038dc6b3Sahlscript() { 140038dc6b3Sahl $dtrace -c ./main -s /dev/stdin <<EOF 141038dc6b3Sahl pid\$target:a.out:foo:entry 142038dc6b3Sahl { 143038dc6b3Sahl gotit = 1; 144038dc6b3Sahl exit(0); 145038dc6b3Sahl } 146038dc6b3Sahl 147038dc6b3Sahl tick-1s 148038dc6b3Sahl /i++ == 5/ 149038dc6b3Sahl { 150038dc6b3Sahl printf("test timed out"); 151038dc6b3Sahl exit(1); 152038dc6b3Sahl } 153038dc6b3Sahl 154038dc6b3Sahl END 155038dc6b3Sahl /!gotit/ 156038dc6b3Sahl { 157038dc6b3Sahl printf("program ended without hitting probe"); 158038dc6b3Sahl exit(1); 159038dc6b3Sahl } 160038dc6b3SahlEOF 161038dc6b3Sahl} 162038dc6b3Sahl 163038dc6b3Sahlscript 164038dc6b3Sahlstatus=$? 165038dc6b3Sahl 166038dc6b3Sahlcd / 167038dc6b3Sahl/usr/bin/rm -rf $DIR 168038dc6b3Sahl 169038dc6b3Sahlexit $status 170