This commit:
[dyninst.git] / dyninstAPI_RT / src / RTmutatedBinary.c
1 /* $Id: RTmutatedBinary.c,v 1.5 2003/01/31 18:55:43 chadd Exp $ */
2
3 /* this file contains the code to restore the necessary
4    data for a mutated binary 
5  */
6
7
8 #include <unistd.h>
9
10 extern int isMutatedExec;
11 char *buffer;
12
13 /* checkMutatedFile() is defined in RTmutatedBinary_<fileformat>.c */
14
15 extern int checkMutatedFile();
16
17 /* with solaris, the mutatee has a jump from
18  * main() to a trampoline that calls DYNINSTinit() the
19  * trampoline resides in the area that was previously
20  * the heap, this trampoline is loaded as part of the
21  * data segment
22  * UPDATE: now the heap tramps are not loaded by the loader
23  * but rather this file so _init is necessary
24  * UPDATE: gcc handles the _init fine, but
25  * cc chokes on it.  There seems to be no compiler
26  * independent way to have my code called correctly
27  * at load time so i have defined _NATIVESO_ in
28  * the sparc Makefile for cc only.  The #pragma
29  * forces the my_init function to be called 
30  * correctly upon load of the library.
31  * Building with gcc is the same as before. 
32  * THIS NEEDS TO BE FIXED 
33  * 
34  * with linux the trampolines are ALL in the big
35  * array at the top of this file and so are not loaded
36  * by the loader as part of the data segment. this
37  * needs to be called to map in everything before
38  * main() jumps to the big array
39  */ 
40
41 #if defined(_NATIVESO_)
42
43 #pragma init (my_init) 
44 void my_init(){
45 #else 
46 void _init(){
47
48 #endif
49
50 /* this buffer is allocated to clear
51    the first page on the heap. This is necessary
52    because loading the heap tramps uses mmap, which
53    is going to eat the heap if the heap begins on 
54    the same page the heap tramps end on (almost certain)
55 */
56         buffer = (char*) malloc(getpagesize());
57         isMutatedExec =checkMutatedFile();
58         free(buffer);
59 }