Made changes for dyninst API to dynamically link libdyninstAPI_RT.so.1.
[dyninst.git] / dyninstAPI / tests / src / test2.mutatee.c
1
2 /* Test application (Mutatee) */
3
4 #include <stdio.h>
5 #include <sys/types.h>
6 #include <signal.h>
7 #include <string.h>
8 #if defined(sparc_sun_sunos4_1_3) || defined(sparc_sun_solaris2_4)
9 #include <unistd.h>
10 #endif
11 #if defined(i386_unknown_nt4_0)
12 #include <stdlib.h>
13 #define WIN32_LEAN_AND_MEAN
14 #include <windows.h>
15 #endif
16
17 #if defined(sparc_sun_solaris2_4) || defined(i386_unknown_solaris2_5)
18 #include <dlfcn.h>
19 #endif
20
21 #include "test2.h"
22
23 /* XXX Currently, there's a bug in the library that prevents a subroutine call
24  * instrumentation point from being recognized if it is the first instruction
25  * in a function.  The following variable is used in this program in a number
26  * of kludges to get around this.
27  */
28 int kludge;
29
30 // control debug printf statements
31 #define dprintf if (debugPrint) printf
32 int debugPrint = 0;
33
34 #define TRUE    1
35 #define FALSE   0
36
37 int isAttached = 0;
38
39 /*
40  * Check to see if the mutator has attached to us.
41  */
42 int checkIfAttached()
43 {
44     return isAttached;
45 }
46
47
48 /*
49  * Stop the process (in order to wait for the mutator to finish what it's
50  * doing and restart us).
51  */
52 void stop_process()
53 {
54 #ifdef i386_unknown_nt4_0
55     DebugBreak();
56 #else
57     kill(getpid(), SIGSTOP);
58 #endif
59 }
60
61
62 void main(int argc, char *argv[])
63 {
64     int i;
65     void *ref;
66     int useAttach = FALSE;
67  
68     for (i=1; i < argc; i++) {
69         if (!strcmp(argv[i], "-verbose")) {
70             debugPrint = 1;
71         } else if (!strcmp(argv[i], "-attach")) {
72             useAttach = TRUE;
73         } else {
74             fprintf(stderr, "Usage: test2.mutatee [-attach] [-verbose]\n");
75             exit(-1);
76         }
77     }
78
79     // see if we should wait for the attach
80     if (useAttach) {
81         printf("Waiting for mutator to attach...\n");
82         while (!checkIfAttached()) ;
83         printf("Mutator attached.  Mutatee continuing.\n");
84     }
85
86 //We'll put this ifdef back when it works under sparc solaris again
87 //#ifdef sparc_sun_solaris2_4
88 #if 0
89     // now use the dlopen interface to force an object to load.
90     ref = dlopen(TEST_DYNAMIC_LIB, RTLD_NOW);
91     if (!ref) {
92         fprintf(stderr, "%s\n", dlerror());
93         fflush(stderr);
94     }
95
96     // Stop and wait for the mutator to check that we linked the library
97     stop_process();
98 #endif
99
100     while(1);
101
102     exit(0);
103 }