# Java Native Invocation and Purify # # Version: @(#)makefile 1.3 12/27/97 # Author: Christopher Hylands # # Copyright (c) 1997 The Regents of the University of California. # All rights reserved. # # Permission is hereby granted, without written agreement and without # license or royalty fees, to use, copy, modify, and distribute this # software and its documentation for any purpose, provided that the # above copyright notice and the following two paragraphs appear in all # copies of this software. # # IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY # FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF # THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE # PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF # CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, # ENHANCEMENTS, OR MODIFICATIONS. # # PT_COPYRIGHT_VERSION_2 # COPYRIGHTENDKEY ########################################################################## # This makefile shows how to use Purify to check for leaks in JNI code # Currently, this only works with JDK1.1.4, it does not work with # JDK1.2beta2 # How to purify: # 1. Get Purify-4.1-beta-L3 from support@rational.com # 2. Set your CLASSPATH: # setenv CLASSPATH /opt/jdk1.1.4/lib/classes.zip:. # 3. Edit this makefile. You probably only need to edit JAVAHOME # 4. Run 'make' # The program will run once without purify and once with purify. # # For more information, see: # http://ptolemy.eecs.berkeley.edu/~cxh/java/purify/index.html # Where's the root of the java distribution? JAVAHOME = /opt/jdk1.1.4 # Purify does not seem to work with JDK1.2beta2, but if you want to try it, # then set the CLASSPATH from the prompt with: # setenv CLASSPATH /opt/jdk1.2beta2/lib/classes.zip:. # and uncomment the lines below. #JAVAHOME = /opt/jdk1.2beta2 #JVM_LD_DIRECTIVE = -ljvm # Purify installation directory. Purify 4.0 will no work. PUREDIR = /usr/eesww/pure/purify ###### # You probably need not edit below here # What's the java compiler binary? JAVAC = $(JAVAHOME)/bin/javac # Directory that contains architecture dependent include files # Usually $(JAVAHOME)/include/solaris or something similar JAVA_ARCH_INCLUDE = $(JAVAHOME)/include/solaris JAVA_INCLUDES = \ -I$(JAVAHOME)/include \ -I$(JAVA_ARCH_INCLUDE) JAVA_LIBDIR = $(JAVAHOME)/lib/sparc JAVA_THREADLIBDIR = $(JAVAHOME)/lib/sparc/native_threads LD_FLAGS = -R $(JAVA_LIBDIR):$(JAVA_THREADLIBDIR) -L$(JAVA_LIBDIR) -L$(JAVA_THREADLIBDIR) -ljava $(JVM_LD_DIRECTIVE) PURIFYOPTIONS = -automount-prefix=/tmp_mnt:/vol -best-effort -cache-dir=/users/cxh/java/jnihello -always-use-cache-dir=yes -ignore_signals=SIGPOLL -threads=yes -use_internal_locks=yes PURELD = $(PUREDIR)/solaris2_threads.so PURIFY = $(PUREDIR)/purify .SUFFIXES: .class .java .java.class: rm -f `basename $< .java`.class CLASSPATH=$(CLASSPATH)$(AUXCLASSPATH) $(JAVAC) $(JFLAGS) $< test: @echo "################" @echo "Local setup:" uname -a -cc -Version $(PURIFY) -version @echo "PURIFYOPTIONS= $(PURIFYOPTIONS)" @echo "################" @echo "Building:" $(MAKE) all @echo "################" @echo "Running without purify:" CLASSPATH=$(CLASSPATH):$(JAVAHOME)/lib/classes.zip \ LD_LIBRARY_PATH=$(JAVA_LIBDIR):$(JAVA_THREADLIBDIR):$(LD_LIBRARY_PATH) \ invoke @echo "################" @echo "Running with purify:" CLASSPATH=$(CLASSPATH):$(JAVAHOME)/lib/classes.zip \ LD_LIBRARY_PATH=$(JAVA_LIBDIR):$(JAVA_THREADLIBDIR):$(LD_LIBRARY_PATH) \ PURIFYOPTIONS="$(PURIFYOPTIONS)" \ invoke.purify TARGETS = Prog.class invoke .purify invoke.purify all: $(TARGETS) .purify: echo "ignore set_single_stepping libjava.so" > $@ echo "registercode nop_0+0x0 Illegal254_0+0x3c libjava.so" >> $@ echo "suppress umr GetDefaultClassPath" >> $@ echo "suppress umr ResolveClassConstant" >> $@ echo "suppress umr ExecuteJava" >> $@ echo "suppress umr quickInvocation" >> $@ echo "suppress umr execute_java_constructor" >> $@ echo "suppress umr do_execute_java_method_vararg" >> $@ echo "suppress umr sysThreadAlloc" >> $@ echo "suppress umr sysDynamicLink" >> $@ echo "suppress umr quickStaticAccess" >> $@ echo "suppress umr Java_java_lang_System_arraycopy_stub" >> $@ echo "suppress umr Java_java_lang_Class_getPrimitiveClass_stub" >> $@ echo "suppress umr fillInStackTrace" >> $@ echo "suppress umr ProcedureFindThrowTag" >> $@ echo "suppress umr mktime; zip_stat" >> $@ echo "suppress umr qst; qsort; initReader" >> $@ echo "suppress umr FindClass" >> $@ invoke: invoke.c cc $(JAVA_INCLUDES) invoke.c -o $@ $(LD_FLAGS) invoke.purify: invoke.c $(PURIFY) $(PURIFYOPTIONS) cc $(JAVA_INCLUDES) invoke.c -o $@ $(PURELD) $(LD_FLAGS) dist: (cd ..; tar -cf jnihello.tar \ jnihello/makefile jnihello/Prog.java jnihello/invoke.c) clean: rm -f $(TARGETS) *.o *.so *.class *~ rm -rf export opt tmp usr vol