diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2011-05-02 19:34:44 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2011-05-02 19:34:44 +0000 | 
| commit | 6b943ff3a3f8617113ecbf611cf0f8957e4e19d2 (patch) | |
| tree | fc5f365fb9035b2d0c622bbf06c9bbe8627d7279 /lib/Object/COFFObjectFile.cpp | |
| parent | d0e4e96dc17a6c1c6de3340842c80f0e187ba349 (diff) | |
Notes
Diffstat (limited to 'lib/Object/COFFObjectFile.cpp')
| -rw-r--r-- | lib/Object/COFFObjectFile.cpp | 25 | 
1 files changed, 19 insertions, 6 deletions
diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index cfee82a0b217..86bf44baaeb6 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -91,6 +91,7 @@ extern char coff_coff_section_layout_static_assert  namespace {  class COFFObjectFile : public ObjectFile {  private: +        uint64_t         HeaderOff;    const coff_file_header *Header;    const coff_section     *SectionTable;    const coff_symbol      *SymbolTable; @@ -185,11 +186,8 @@ char COFFObjectFile::getSymbolNMTypeChar(DataRefImpl Symb) const {      return ret;    uint32_t Characteristics = 0; -  uint32_t PointerToRawData = 0; -  const coff_section *Section = getSection(symb->SectionNumber); -  if (Section) { +  if (const coff_section *Section = getSection(symb->SectionNumber)) {      Characteristics = Section->Characteristics; -    PointerToRawData = Section->PointerToRawData;    }    switch (symb->SectionNumber) { @@ -256,7 +254,7 @@ StringRef COFFObjectFile::getSectionName(DataRefImpl Sec) const {    // Check for string table entry. First byte is '/'.    if (name[0] == '/') {      uint32_t Offset; -    name.getAsInteger(10, Offset); +    name.substr(1).getAsInteger(10, Offset);      return StringRef(getString(Offset));    } @@ -287,9 +285,20 @@ bool COFFObjectFile::isSectionText(DataRefImpl Sec) const {  COFFObjectFile::COFFObjectFile(MemoryBuffer *Object)    : ObjectFile(Object) { -  Header = reinterpret_cast<const coff_file_header *>(base); + +  HeaderOff = 0; + +  if (base[0] == 0x4d && base[1] == 0x5a) { +    // PE/COFF, seek through MS-DOS compatibility stub and 4-byte +    // PE signature to find 'normal' COFF header. +    HeaderOff += *reinterpret_cast<const ulittle32_t *>(base + 0x3c); +    HeaderOff += 4; +  } + +  Header = reinterpret_cast<const coff_file_header *>(base + HeaderOff);    SectionTable =      reinterpret_cast<const coff_section *>( base +                                          + HeaderOff                                            + sizeof(coff_file_header)                                            + Header->SizeOfOptionalHeader);    SymbolTable = @@ -303,6 +312,7 @@ COFFObjectFile::COFFObjectFile(MemoryBuffer *Object)  ObjectFile::symbol_iterator COFFObjectFile::begin_symbols() const {    DataRefImpl ret; +  memset(&ret, 0, sizeof(DataRefImpl));    ret.p = reinterpret_cast<intptr_t>(SymbolTable);    return symbol_iterator(SymbolRef(ret, this));  } @@ -310,18 +320,21 @@ ObjectFile::symbol_iterator COFFObjectFile::begin_symbols() const {  ObjectFile::symbol_iterator COFFObjectFile::end_symbols() const {    // The symbol table ends where the string table begins.    DataRefImpl ret; +  memset(&ret, 0, sizeof(DataRefImpl));    ret.p = reinterpret_cast<intptr_t>(StringTable);    return symbol_iterator(SymbolRef(ret, this));  }  ObjectFile::section_iterator COFFObjectFile::begin_sections() const {    DataRefImpl ret; +  memset(&ret, 0, sizeof(DataRefImpl));    ret.p = reinterpret_cast<intptr_t>(SectionTable);    return section_iterator(SectionRef(ret, this));  }  ObjectFile::section_iterator COFFObjectFile::end_sections() const {    DataRefImpl ret; +  memset(&ret, 0, sizeof(DataRefImpl));    ret.p = reinterpret_cast<intptr_t>(SectionTable + Header->NumberOfSections);    return section_iterator(SectionRef(ret, this));  }  | 
