COFF.h revision 5c2b4ea73c8f48bb5f96c86fe437385b8fb3dcda
1//===- COFF.h - COFF object file implementation -----------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the COFFObjectFile class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_OBJECT_COFF_H
15#define LLVM_OBJECT_COFF_H
16
17#include "llvm/Object/ObjectFile.h"
18#include "llvm/Support/COFF.h"
19#include "llvm/Support/Endian.h"
20
21namespace llvm {
22namespace object {
23
24struct coff_file_header {
25  support::ulittle16_t Machine;
26  support::ulittle16_t NumberOfSections;
27  support::ulittle32_t TimeDateStamp;
28  support::ulittle32_t PointerToSymbolTable;
29  support::ulittle32_t NumberOfSymbols;
30  support::ulittle16_t SizeOfOptionalHeader;
31  support::ulittle16_t Characteristics;
32};
33
34struct coff_symbol {
35  struct StringTableOffset {
36    support::ulittle32_t Zeroes;
37    support::ulittle32_t Offset;
38  };
39
40  union {
41    char ShortName[8];
42    StringTableOffset Offset;
43  } Name;
44
45  support::ulittle32_t Value;
46  support::little16_t SectionNumber;
47
48  support::ulittle16_t Type;
49
50  support::ulittle8_t  StorageClass;
51  support::ulittle8_t  NumberOfAuxSymbols;
52
53  uint8_t getBaseType() const {
54    return Type & 0x0F;
55  }
56
57  uint8_t getComplexType() const {
58    return (Type & 0xF0) >> 4;
59  }
60};
61
62struct coff_section {
63  char Name[8];
64  support::ulittle32_t VirtualSize;
65  support::ulittle32_t VirtualAddress;
66  support::ulittle32_t SizeOfRawData;
67  support::ulittle32_t PointerToRawData;
68  support::ulittle32_t PointerToRelocations;
69  support::ulittle32_t PointerToLinenumbers;
70  support::ulittle16_t NumberOfRelocations;
71  support::ulittle16_t NumberOfLinenumbers;
72  support::ulittle32_t Characteristics;
73};
74
75struct coff_relocation {
76  support::ulittle32_t VirtualAddress;
77  support::ulittle32_t SymbolTableIndex;
78  support::ulittle16_t Type;
79};
80
81struct coff_aux_section_definition {
82  support::ulittle32_t Length;
83  support::ulittle16_t NumberOfRelocations;
84  support::ulittle16_t NumberOfLinenumbers;
85  support::ulittle32_t CheckSum;
86  support::ulittle16_t Number;
87  support::ulittle8_t Selection;
88  char Unused[3];
89};
90
91class COFFObjectFile : public ObjectFile {
92private:
93  const coff_file_header *Header;
94  const coff_section     *SectionTable;
95  const coff_symbol      *SymbolTable;
96  const char             *StringTable;
97        uint32_t          StringTableSize;
98
99        error_code        getString(uint32_t offset, StringRef &Res) const;
100
101  const coff_symbol      *toSymb(DataRefImpl Symb) const;
102  const coff_section     *toSec(DataRefImpl Sec) const;
103  const coff_relocation  *toRel(DataRefImpl Rel) const;
104
105protected:
106  virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const;
107  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const;
108  virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const;
109  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const;
110  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const;
111  virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const;
112  virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const;
113  virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const;
114  virtual error_code getSymbolSection(DataRefImpl Symb,
115                                      section_iterator &Res) const;
116
117  virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const;
118  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const;
119  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const;
120  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const;
121  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const;
122  virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const;
123  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
124  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
125  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
126  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
127                                           bool &Result) const;
128  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;
129  virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const;
130
131  virtual error_code getRelocationNext(DataRefImpl Rel,
132                                       RelocationRef &Res) const;
133  virtual error_code getRelocationAddress(DataRefImpl Rel,
134                                          uint64_t &Res) const;
135  virtual error_code getRelocationOffset(DataRefImpl Rel,
136                                         uint64_t &Res) const;
137  virtual error_code getRelocationSymbol(DataRefImpl Rel,
138                                         SymbolRef &Res) const;
139  virtual error_code getRelocationType(DataRefImpl Rel,
140                                       uint64_t &Res) const;
141  virtual error_code getRelocationTypeName(DataRefImpl Rel,
142                                           SmallVectorImpl<char> &Result) const;
143  virtual error_code getRelocationAdditionalInfo(DataRefImpl Rel,
144                                                 int64_t &Res) const;
145  virtual error_code getRelocationValueString(DataRefImpl Rel,
146                                           SmallVectorImpl<char> &Result) const;
147
148  virtual error_code getLibraryNext(DataRefImpl LibData,
149                                    LibraryRef &Result) const;
150  virtual error_code getLibraryPath(DataRefImpl LibData,
151                                    StringRef &Result) const;
152
153public:
154  COFFObjectFile(MemoryBuffer *Object, error_code &ec);
155  virtual symbol_iterator begin_symbols() const;
156  virtual symbol_iterator end_symbols() const;
157  virtual symbol_iterator begin_dynamic_symbols() const;
158  virtual symbol_iterator end_dynamic_symbols() const;
159  virtual library_iterator begin_libraries_needed() const;
160  virtual library_iterator end_libraries_needed() const;
161  virtual section_iterator begin_sections() const;
162  virtual section_iterator end_sections() const;
163
164  virtual uint8_t getBytesInAddress() const;
165  virtual StringRef getFileFormatName() const;
166  virtual unsigned getArch() const;
167
168  error_code getHeader(const coff_file_header *&Res) const;
169  error_code getSection(int32_t index, const coff_section *&Res) const;
170  error_code getSymbol(uint32_t index, const coff_symbol *&Res) const;
171  template <typename T>
172  error_code getAuxSymbol(uint32_t index, const T *&Res) const {
173    const coff_symbol *s;
174    error_code ec = getSymbol(index, s);
175    Res = reinterpret_cast<const T*>(s);
176    return ec;
177  }
178  error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const;
179
180  static inline bool classof(const Binary *v) {
181    return v->getType() == isCOFF;
182  }
183  static inline bool classof(const COFFObjectFile *v) { return true; }
184};
185
186}
187}
188
189#endif
190