Refactoring of symtab code - - - - - - - - - - - - - - - - - - - - - - -
[dyninst.git] / symtabAPI / src / emitElf.h
1 #if !defined(_emit_Elf_h_)
2 #define _emit_Elf_h_
3
4 #include "Object.h"
5
6 namespace Dyninst{
7 namespace SymtabAPI{
8
9 class emitElf{
10   public:
11     emitElf(Elf_X &oldElfHandle_, bool isStripped_ = false, int BSSexpandflag = false, void (*)(const char *) = log_msg);
12     ~emitElf();
13
14     bool checkIfStripped(Symtab *obj, vector<Symbol *>&functions, vector<Symbol *>&variables, vector<Symbol *>&mods, vector<Symbol *>&notypes);
15     bool driver(Symtab *obj, std::string fName);
16  
17   private:
18     Elf_X oldElfHandle;
19     Elf *newElf;
20     Elf *oldElf;
21     
22     //New Section & Program Headers
23     Elf32_Ehdr *newEhdr;
24     Elf32_Ehdr *oldEhdr;
25     
26     Elf32_Phdr *newPhdr;
27     Elf32_Phdr *oldPhdr;
28
29     //important data sections in the
30     //new Elf that need updated
31     Elf_Data *textData;
32     Elf_Data *symStrData;
33     Elf_Data *dynStrData;
34     Elf_Data *symTabData;
35     Elf_Data *hashData;
36     Elf_Data *dynsymData;
37     Elf_Data *rodata;
38     Elf_Data *dataData;
39     
40     Elf32_Shdr *textSh;
41     Elf32_Shdr *rodataSh;
42     
43     //Symbol table(.symtab) symbols
44     std::vector<Elf32_Sym *> symbols;
45     std::vector<std::string> symbolStrs; //names of symbols
46     unsigned symbolNamesLength; //Total size of all the names
47
48     std::vector<Section *>nonLoadableSecs;
49
50     // Needed when adding a new segment
51     Elf32_Off newSegmentStart;
52     Elf32_Shdr *firstNewLoadSec;// initialize to NULL
53  
54     //text & data segment ends
55     Elf32_Off dataSegEnd, textSegEnd;
56
57     //flags
58     // Expand NOBITS sections within the object file to their size
59     bool BSSExpandFlag;
60     bool addNewSegmentFlag;
61     
62     bool isStripped;
63
64     void (*err_func_)(const char*);
65
66     bool getBackSymbol(Symbol *symbol);
67     void findSegmentEnds();
68     void addSectionNames(Elf_Data *&, Elf_Data *, unsigned , unsigned , vector<std::string> &);
69     bool createNonLoadableSections(Elf32_Shdr *shdr, unsigned shstrtabDataSize, unsigned);
70     void addSectionNames(Elf_Data *&, Elf_Data *, unsigned , unsigned , std::vector<std::string> &, std::vector<Section*>&);
71     bool createLoadableSections( Elf32_Shdr *shdr, std::vector<Section *>&newSecs, std::vector<std::string> &loadSecNames, unsigned &shstrtabDataSize, unsigned &nonLoadableNamesSize, unsigned &loadSecTotalSize);
72
73     void updateSymbols(Elf_Data* symtabData,Elf_Data* strData, unsigned long loadSecsSize);
74     
75     void log_elferror(void (*err_func)(const char *), const char* msg);
76 };
77
78 } // namespace SymtabAPI
79 } // namespace Dyninst
80
81 #endif