these files are for the save the world functionality
[dyninst.git] / dyninstAPI / src / addLibrary.h
1 /* $Id: addLibrary.h,v 1.1 2001/12/11 20:22:22 chadd Exp $ */
2
3
4 #if defined(BPATCH_LIBRARY) && defined(sparc_sun_solaris2_4)
5
6 #ifndef addlibrary_h_
7 #define addlibrary_h_
8
9
10 #include <unistd.h>
11 #include  <fcntl.h>
12 #include  <stdio.h>
13 #include  <libelf.h>
14 #include  <stdlib.h>
15 #include  <string.h>
16 #include <errno.h>
17 #include "ELF_Section.h"
18
19
20 typedef struct _relocationData{
21
22         unsigned int olddynstrIndx;
23         unsigned int olddynsymIndx;
24         unsigned int olddynamicIndx;
25         unsigned int newdynstrIndx;
26         unsigned int newdynsymIndx;
27         unsigned int newdynamicIndx;
28
29         Elf32_Word olddynstrAddr;
30         Elf32_Word olddynsymAddr;
31         Elf32_Word olddynamicAddr;
32         Elf32_Word newdynstrAddr;
33         Elf32_Word newdynsymAddr;
34         Elf32_Word newdynamicAddr;
35
36 } RelocationData;
37
38 typedef struct _node{
39         char* name;
40         Elf32_Addr newAddr;
41         Elf32_Addr delta;
42         _node *next;
43 } Node;
44
45 typedef struct {
46         Elf32_Addr d_addr;
47         Elf32_Addr d_size;
48 } addrReloc;
49
50 #define DT_NULL    0
51 #define DT_NEEDED 1
52 #define DT_STRTAB 5
53 #define DT_PLTREL 20
54 #define DT_PLTGOT 3
55 #define DT_HASH   4
56 #define DT_SYMTAB 6
57 #define DT_RELA   7
58 #define DT_INIT   12
59 #define DT_FINI   13
60 #define DT_REL    17
61 #define DT_VERDEF 0x6ffffffc/* Points to SUNW_verdef */
62 #define DT_VERDEFNUM 0x6ffffffd/* #def */
63 #define DT_VERNEED 0x6ffffffe/* Points to SUNW_verneed */
64 #define DT_VERNEEDNUM 0x6fffffff/* #need */
65 #define DT_JMPREL 23
66 #define DT_STRSZ  10
67 #define DT_CHECKSUM 0x6ffffdf8
68 #define DT_DEBUG  21
69
70
71 class addLibrary {
72
73
74
75         private:
76                 Elf* newElf;
77                 Elf* oldElf;
78                 char* libraryName;
79
80                 addrReloc *relocations;
81                 int relocIndex;
82                 Elf_Data *dynamicData, *dynstrData, *dynsymData, *strData, *newStrData;         
83                 RelocationData relocData;
84                 int bssSize;
85                 Elf32_Shdr* dynstrShdr, *dynsymShdr, *dynamicShdr;
86                 unsigned int gotAddr, sizeChange ;
87                 Elf_Data *textData,*dynamicDataNew,*symtabData,*symstrData, *oldsymtabData;
88                 Elf_Data *olddyn, symData,*GOTData,*hashData, *olddynsymData;
89                 int dynstrOffset ;
90                 int debugFlag;
91                 Elf32_Ehdr *   ehdr,*newEhdr;
92                 void updateDynamic(Elf_Data* dynamicData, unsigned int dynstrAddr, unsigned int dynsymAddr);
93                 void remakeHash(Elf_Data* hashData, Elf_Data* dynsymData, Elf_Data* dynstrData);
94                 void updateRela(Elf_Data* newData,int shift, unsigned int shiftIndex);
95                 void updateGOT(Elf_Data* GOTData,unsigned int dynamicAddr);
96                 void updateSymbols(Elf_Data* symtabData, Elf_Data *oldsymData,
97                         RelocationData relocData, int maxShndx);        
98                 void updateSh_link(Elf32_Word *sh_link,RelocationData relocData);
99
100                 void  updateSymTab(Elf_Data* symData, RelocationData relocData, int shift,
101                         int max, Elf_Data*symstrPtr);   
102                 void updateSectionHdrs(Elf * newElf);
103                 void updateProgramHdrs(Elf *newElf,int size, unsigned int gotOffset, Elf32_Word dynamicAddr,
104                         Elf32_Word dynamicOffset, int bssSize,int dynamicSize, int dynSize);
105                 bool writeOutNewElf();  
106                 void driver();
107                 void parseOldElf();
108                 void padData(Elf32_Shdr* newDataShdr, Elf32_Shdr* newDynamicShdr, Elf_Scn* newDynSec, 
109                         Elf_Data* newDataData);
110                 void verifyNewFile();
111         public:
112
113                 addLibrary(char*oldElfName, char* libname, int debugOutputFlag=false);
114                 addLibrary(Elf *oldElfPtr, char* libname, int debugOutputFlag=false);
115                 ~addLibrary();
116                 bool outputElf(char* filename=NULL);
117
118                 Elf* getNewElf();
119 };
120
121 #endif
122 #endif