Folks:
[dyninst.git] / dyninstAPI / src / addLibrary.h
1 /* $Id: addLibrary.h,v 1.3 2002/05/21 17:40:30 chadd Exp $ */\r
2 \r
3 #if defined(BPATCH_LIBRARY) && defined(sparc_sun_solaris2_4)\r
4 \r
5 #include <unistd.h>\r
6 #include  <fcntl.h>\r
7 #include  <stdio.h>\r
8 #include  <libelf.h>\r
9 #include  <stdlib.h>\r
10 #include  <string.h>\r
11 #include <errno.h>\r
12 #include <elf.h>\r
13 #include <sys/link.h>\r
14 \r
15 typedef struct _Elf_element{\r
16         Elf32_Shdr *sec_hdr;\r
17         Elf_Data *sec_data;\r
18 } Elf_element;\r
19 \r
20 #define TEXTGAP 1\r
21 #define DATAGAP 2\r
22 \r
23 class addLibrary {\r
24 \r
25         private:\r
26 \r
27         int arraySize;\r
28         Elf_element *newElfFileSec;\r
29         Elf32_Phdr *newElfFilePhdr;\r
30         Elf32_Ehdr *newElfFileEhdr;\r
31         Elf *oldElf, *newElf;\r
32         int newFd;\r
33         Elf_Data *strTabData;\r
34 \r
35 \r
36         int numberExtraSegs;\r
37         int gapFlag;\r
38         unsigned int newPhdrAddr;\r
39         unsigned int newPhdrOffset;\r
40         int libnameLen;\r
41         unsigned int phdrSize;\r
42         int libnameIndx;\r
43         unsigned int textSegEndIndx; \r
44         unsigned int dataSegStartIndx;\r
45 \r
46         \r
47         void createNewElf();\r
48         int findSection(char *name);\r
49         void updateDynamic(Elf_Data*newData,unsigned int hashOff, unsigned int dynsymOff, unsigned int dynstrOff);\r
50         void updateProgramHeaders(Elf32_Phdr *phdr, unsigned int dynstrOffset, Elf32_Shdr**newSegs);\r
51         void addStr(Elf_Data* newData, Elf_Data* oldData, char *str);\r
52         int writeNewElf(char* filename, char* libname);\r
53         unsigned int findEndOfTextSegment();\r
54         unsigned int findStartOfDataSegment();\r
55 \r
56         int findNewPhdrAddr();\r
57         int findNewPhdrOffset();\r
58         int checkFile();\r
59 \r
60         void fixUpPhdrForDynamic();\r
61         void moveDynamic();\r
62         void updateSymbols(Elf_Data* symtabData,Elf_Data* strData, unsigned int dynAddr);\r
63 \r
64 \r
65         unsigned int _pageSize, realPageSize;   \r
66         public:\r
67         int driver(Elf *elf, char *newfilename, char *libname);\r
68         addLibrary();\r
69         ~addLibrary();\r
70 \r
71 };\r
72 \r
73 \r
74 #endif\r
75 \r