| Author | 
		  Message
		 | 
		
		  | aboggis | 
		  
		    
			  
				 Posted: Wed Oct 15, 2003 1:51 pm    Post subject: Building an API exit on Solaris | 
				     | 
			   
			 
		   | 
		
		
		    Centurion
 
 Joined: 18 Dec 2001 Posts: 105 Location: Auburn, California 
  | 
		  
		    
			  
				I am trying to get MQ to run my API exit, written in C++ (it's a hacked version of the sample amqsaxe0.c). It works fine under Windows.
 
 
I am using the following to build the .so file:
 
 
   
	| Code: | 
   
  
	| CC -mt mqAPIExit.cpp -G -o mqAPIExit.so -lmqmzf -lmqm -lmqmcs -lmqmzse | 
   
 
 
 
and no errors are generated, and the output is generated.
 
 
I have added the following to qm.ini:
 
 
   
	| Code: | 
   
  
	ApiExitLocal:
 
   Sequence=100
 
   Function=EntryPoint
 
   Module=/var/mqm/exits/mqAPIExit.so
 
   Name=mqAPIExit
 
   Data=16 | 
   
 
 
 
But when I try to start the qmgr I get the following:
 
 
   
	| Code: | 
   
  
	[aboggis@vdpsusptar01:/var/mqm/trace]$ strmqm TEST
 
AMQ7214: The module '/var/mqm/exits/mqAPIExit.so' for Api Exit 'mqAPIExit'
 
could not be loaded for reason xecU_S_LOAD_FAILED. | 
   
 
 
 
I have tried running an early trace, but all the trace files give me is the same return code info, so I am suspecting that my build is not good.
 
 
Any help/comments appreciated,
 
 
Regards,
 
 
tonyB. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | clindsey | 
		  
		    
			  
				 Posted: Wed Oct 15, 2003 4:56 pm    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		   Knight
 
 Joined: 12 Jul 2002 Posts: 586 Location: Dallas, Tx 
  | 
		  
		    
			  
				Tony,
 
 
A couple of suggestions. Add "-hEntryPoint" to export the entrypoint name and leave off the .so extension.
 
Note that the sample in /opt/mqm/samp/bin is just "amqsaxe", no lib prefix or .so extension. 
 
 
Here is a make file that will build an apiexit on Solaris. If you save as amqsaxe.mak, then build with make -f amqsaxe.mak
 
 
   
	| Code: | 
   
  
	
 
# amqsaxe.mak
 
# build an API Exit on solaris
 
APIEXIT = amqsaxe
 
ENTRY   = EntryPoint
 
 
#------------------------------------------------------------------
 
# set OUTDIR to create dll in a path other than current directory  
 
#------------------------------------------------------------------
 
OUTDIR = .
 
 
#------------------------------------------------------------------
 
# Forte C compiler                 
 
#------------------------------------------------------------------
 
CC = cc
 
LINK = ld
 
 
#------------------------------------------------------------------
 
# Compile flags for non-debug build
 
#------------------------------------------------------------------
 
CFLAGS = -c -KPIC -mt
 
 
#------------------------------------------------------------------
 
# Link flags for non-debug build
 
#------------------------------------------------------------------
 
LINKFLAGS = -dy -G -h$(ENTRY)
 
 
#------------------------------------------------------------------
 
# Link libraries
 
#------------------------------------------------------------------
 
LIBS = -lmqm -lmqmzf
 
 
 
COPY = cp
 
ERASE = rm 
 
 
 
ALL :   \
 
        $(OUTDIR)\lib$(APIEXIT)
 
       
 
 
#------------------------------------------------------------------
 
# run make CLEAN to remove working files
 
#------------------------------------------------------------------
 
CLEAN:  
 
   $(ERASE) *.o *.map $(APIEXIT)
 
        
 
 
#------------------------------------------------------------------
 
# List of object file to be built
 
#------------------------------------------------------------------
 
APIEXIT_OBJS = amqsaxe0.o
 
 
 
#------------------------------------------------------------------
 
# List of object file dependencies
 
#------------------------------------------------------------------
 
amqsaxe0.o: amqsaxe0.c
 
   $(CC) $(CFLAGS) amqsaxe0.c
 
 
 
 
#------------------------------------------------------------------
 
# Generate the shared libs
 
#------------------------------------------------------------------
 
$(OUTDIR)\lib$(APIEXIT): $(APIEXIT_OBJS) 
 
   $(LINK) $(LINKFLAGS) -o $(APIEXIT) $(APIEXIT_OBJS) $(LIBS)
 
 | 
   
 
 | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | aboggis | 
		  
		    
			  
				 Posted: Thu Oct 16, 2003 10:57 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Centurion
 
 Joined: 18 Dec 2001 Posts: 105 Location: Auburn, California 
  | 
		  
		    
			  
				Thanks for the info.
 
 
I took your details from the makefile above and successfully built the module (using CC), but still get the same MQ error.
 
 
Here's my options:
 
 
   
	| Code: | 
   
  
	CC -c -KPIC -mt mqAPIExit.cpp
 
ld -dy -G -hEntryPoint -o mqAPIExit mqAPIExit.o -lmqm -lmqmzf | 
   
 
 
 
Here's the compiler/linker info:
 
   
	| Code: | 
   
  
	[aboggis@vdpsusdvas01:~/mqAPIExit]$ CC -V      
 
CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-14 2003/03/24
 
[aboggis@vdpsusdvas01:~/mqAPIExit]$ ld -V
 
ld: Software Generation Utilities - Solaris Link Editors: 5.8-1.277
 
[aboggis@vdpsusdvas01:~/mqAPIExit]$ | 
   
 
 
 
 
I do notice just a couple of differences between the binary 'amqsaxe' and my file.
 
 
   
	| Code: | 
   
  
	[aboggis@vdpsusptar01:~]$ ls -l /var/mqm/exits/
 
total 88
 
-rwxrwsr-x   1 mqm      mqm         1532 Sep 15 15:00 amqsaxe
 
-rwxr-xr-x   1 aboggis  mqm        42956 Oct 16 11:53 mqAPIExit | 
   
 
 
 
I don't really understand why my file is so much larger (unless it's something to do with how the Sun C++ compiler/linker generates code). Also the owner/group is different. Would these have an effect? | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | aboggis | 
		  
		    
			  
				 Posted: Thu Oct 16, 2003 11:48 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Centurion
 
 Joined: 18 Dec 2001 Posts: 105 Location: Auburn, California 
  | 
		  
		    
			  
				At the suggestion of Peter (from the MQSeries Mailing List), I tried the following also:
 
 
   
	| Code: | 
   
  
	CC -c -O -mt -KPIC mqAPIExit.cpp -o mqAPIExit.o
 
CC -G -mt -lmqmzf -lmqm -lmqmcs -lmqmzse mqAPIExit.o -o mqAPIExit.so | 
   
 
 
 
This generated the following:
 
 
   
	| Code: | 
   
  
	total 160
 
drwxrwxr-x   2 mqm      mqm          512 Oct 16 12:40 .
 
drwxrwxr-x   9 mqm      mqm          512 Sep 30 15:22 ..
 
-rwxrwsr-x   1 mqm      mqm         1532 Sep 15 15:00 amqsaxe
 
-rwxr-xr-x   1 aboggis  mqm        42956 Oct 16 11:53 mqAPIExit
 
-rwxr-xr-x   1 aboggis  mqm        34648 Oct 16 12:39 mqAPIExit.so | 
   
 
 
 
Different size again... ? | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | harwinderr | 
		  
		    
			  
				 Posted: Thu Oct 16, 2003 8:43 pm    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Voyager
 
 Joined: 29 Jan 2002 Posts: 90
  
  | 
		  
		    
			  
				| Make sure that the APIExit is in your LD_LIBRARY_PATH. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | aboggis | 
		  
		    
			  
				 Posted: Tue Oct 21, 2003 9:34 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Centurion
 
 Joined: 18 Dec 2001 Posts: 105 Location: Auburn, California 
  | 
		  
		    
			  
				
   
	| Quote: | 
   
  
	| Make sure that the APIExit is in your LD_LIBRARY_PATH. | 
   
 
 
Not required. I can run/use the pre-built APIExit (amqsaxe) fine. Doesn't need to be on LD_LIBRARY_PATH at all.
 
 
Is anyone reading this?
 
 
Anyway. Instead of trying to continue with my own, home grown code, I thought I simply try compiling the suppied source for amqsaxe (amqsaxe0.c).
 
 
Using Forte Developer 6 (Workshop 6.0 FCS 2001/05/06), here's the compiler commands that generate a binary (that still doesn't work):
 
 
   
	| Code: | 
   
  
	/opt/SUNWspro/WS6U2/bin/cc -mt -s -c -Kpic  -o output/amqsaxe0.o amqsaxe0.c
 
CC -G -o output/amqsaxe -h amqsaxe -norunpath output/amqsaxe0.o | 
   
 
 
 
I wish that IBM would supply the makefiles/build-scripts to go along with the sample code.
 
 
Here's the whole makefile:
 
   
	| Code: | 
   
  
	## -*- Makefile -*-
 
##
 
## Project: /home/aboggis/amqsaxe/amqsaxe.prd
 
## User: aboggis
 
## Time: 03/10/20 10:49:39
 
## Makefile created by Sun WorkShop.
 
##
 
## This file is generated automatically -- DO NOT EDIT.
 
##
 
 
 
 
project: output/amqsaxe 
 
 
##### Compilers and tools definitions shared by all build objects #####
 
CC=/opt/SUNWspro/WS6U2/bin/cc
 
CFLAGS=-mt -s 
 
 
 
###### Target: amqsaxe ######
 
TARGETDIR_AMQSAXE=output
 
CFLAGS_AMQSAXE=-Kpic 
 
OBJS_AMQSAXE = \
 
   $(TARGETDIR_AMQSAXE)/amqsaxe0.o 
 
 
 
# Link or archive
 
output/amqsaxe: $(OBJS_AMQSAXE) 
 
   $(LINK.cc)  $(CCFLAGS_AMQSAXE) $(CPPFLAGS_AMQSAXE) -G -o output/amqsaxe -h amqsaxe -norunpath $(OBJS_AMQSAXE) 
 
 
# Compile source files into .o's
 
$(TARGETDIR_AMQSAXE)/amqsaxe0.o: amqsaxe0.c
 
   $(COMPILE.c) $(CFLAGS_AMQSAXE) $(CPPFLAGS_AMQSAXE) -o $(TARGETDIR_AMQSAXE)/amqsaxe0.o amqsaxe0.c
 
 
 
###### clean target: deletes generated files ######
 
clean:
 
   $(RM) \
 
   output/amqsaxe \
 
   $(TARGETDIR_AMQSAXE)/amqsaxe0.o 
 
 
# Enable dependency checking
 
.KEEP_STATE:
 
.KEEP_STATE_FILE: /home/aboggis/amqsaxe/.make.state.Makefile.aboggis.amqsaxe | 
   
 
 
 
Heeeeellllppppp meeeeeee    | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | EddieA | 
		  
		    
			  
				 Posted: Tue Oct 21, 2003 1:34 pm    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Jedi
 
 Joined: 28 Jun 2001 Posts: 2453 Location: Los Angeles 
  | 
		  
		    
			  
				Tony,
 
 
Just a wild guess, because something simililar bit me with a 'normal' MQ proggie.  It compiled, but wouldn't run.
 
 
I see you're using the SUNWspro compiler, which is the correct one, although the examples don't have the WS6U2 path in them        Have you also got the SUNWspro/lib in the LD_LIBRARY path when you compile/link.
 
 
Cheers, _________________ Eddie Atherton
 
IBM Certified Solution Developer - WebSphere Message Broker V6.1
 
IBM Certified Solution Developer - WebSphere Message Broker V7.0 | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | aboggis | 
		  
		    
			  
				 Posted: Tue Oct 21, 2003 5:49 pm    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Centurion
 
 Joined: 18 Dec 2001 Posts: 105 Location: Auburn, California 
  | 
		  
		    
			  
				You're my hero Eddie    
 
 
I'm not 100% certain that was the answer, but that certainly seems to work. I noticed that my makefile was missing explicit linking of libmqm.so & libmqmzf.so, so I added those also.
 
 
Note to self: Make sure Solaris profile is updated.
 
 
Note to IBM: A little bit more detail in the Application Programming Reference / Guide on building exits and MQ applications in general for supported compilers. *OR* at least ship the makefiles for all the supplied sample programs.
 
 
Now that I have a working build to go from, I'll see if I can get a C++ version of the exit working. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | aboggis | 
		  
		    
			  
				 Posted: Tue Oct 21, 2003 5:55 pm    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Centurion
 
 Joined: 18 Dec 2001 Posts: 105 Location: Auburn, California 
  | 
		  
		    
			  
				For future reference here's the generated makefile:
 
 
   
	| Code: | 
   
  
	## -*- Makefile -*-
 
##
 
## Project: /home/aboggis/amqsaxe/amqsaxe.prd
 
## User: aboggis
 
## Time: 03/10/21 18:30:50
 
## Makefile created by Sun WorkShop.
 
##
 
## This file is generated automatically -- DO NOT EDIT.
 
##
 
 
 
 
project: output/amqsaxe
 
 
##### Compilers and tools definitions shared by all build objects #####
 
CC=/opt/SUNWspro/WS6U2/bin/cc
 
CFLAGS=-mt
 
 
 
###### Target: amqsaxe ######
 
TARGETDIR_AMQSAXE=output
 
CFLAGS_AMQSAXE=-Kpic
 
CPPFLAGS_AMQSAXE += \
 
        -I/opt/mqm/inc
 
OBJS_AMQSAXE = \
 
        $(TARGETDIR_AMQSAXE)/amqsaxe0.o \
 
        /opt/mqm/lib/libmqm.so \
 
        /opt/mqm/lib/libmqmzf.so
 
 
 
# Link or archive
 
output/amqsaxe: $(OBJS_AMQSAXE)
 
        $(LINK.cc)  $(CCFLAGS_AMQSAXE) $(CPPFLAGS_AMQSAXE) -G -o output/amqsaxe -h amqsaxe -norunpath $(OBJS_AM
 
QSAXE)
 
 
# Compile source files into .o's
 
$(TARGETDIR_AMQSAXE)/amqsaxe0.o: amqsaxe0.c
 
        $(COMPILE.c) $(CFLAGS_AMQSAXE) $(CPPFLAGS_AMQSAXE) -o $(TARGETDIR_AMQSAXE)/amqsaxe0.o amqsaxe0.c
 
 
 
###### clean target: deletes generated files ######
 
clean:
 
        $(RM) \
 
        output/amqsaxe \
 
        $(TARGETDIR_AMQSAXE)/amqsaxe0.o
 
 
# Enable dependency checking
 
.KEEP_STATE:
 
.KEEP_STATE_FILE: /home/aboggis/amqsaxe/.make.state.Makefile.aboggis.amqsaxe | 
   
 
 | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | j1 | 
		  
		    
			  
				 Posted: Tue Apr 11, 2006 11:11 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Centurion
 
 Joined: 23 Jun 2003 Posts: 139
  
  | 
		  
		    
			  
				| I am getting the very same error, even though I am just trying to run the IBM supplied API exit amqsaxe. This is MQ 6.0.1 on Soalris. any ideas ? | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | jefflowrey | 
		  
		    
			  
				 Posted: Tue Apr 11, 2006 11:13 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		   Grand Poobah
 
 Joined: 16 Oct 2002 Posts: 19981
  
  | 
		  
		    
			  
				Which error?  There are a few in this topic. _________________ I am *not* the model of the modern major general. | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | j1 | 
		  
		    
			  
				 Posted: Tue Apr 11, 2006 11:25 am    Post subject:  | 
				     | 
			   
			 
		   | 
		
		
		    Centurion
 
 Joined: 23 Jun 2003 Posts: 139
  
  | 
		  
		    
			  
				This one
 
 
   
	| Quote: | 
   
  
	
 
----- amqxufnx.c : 1158 -------------------------------------------------------
 
04/11/06 03:24:41 PM - Process(2640.1) User(mqm) Program(nsqmq)
 
AMQ7214: The module for API Exit 'SampleApiExit' could not be loaded.
 
 
EXPLANATION:
 
The module '/opt/mqm/samp/bin/amqsaxe' for API Exit 'SampleApiExit' could not
 
be loaded for reason xecU_S_LOAD_FAILED.
 
ACTION:
 
Correct the problem with the API Exit module 'SampleApiExit'.
 
 | 
   
 
 | 
			   
			 
		   | 
		
		
		  | Back to top | 
		  
		  	
		   | 
		
		
		    | 
		
		
		  | 
		    
		   |