1e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//===-- ObjectFilePECOFF.cpp ------------------------------------*- C++ -*-===// 2e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 3e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// The LLVM Compiler Infrastructure 4e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 5e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// This file is distributed under the University of Illinois Open Source 6e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// License. See LICENSE.TXT for details. 7e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 8e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//===----------------------------------------------------------------------===// 9e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 10e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "ObjectFilePECOFF.h" 11e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 12e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "llvm/Support/MachO.h" 13e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 14e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/ArchSpec.h" 15e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/DataBuffer.h" 16e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Host/FileSpec.h" 17e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/FileSpecList.h" 18e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/Module.h" 1936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton#include "lldb/Core/ModuleSpec.h" 20e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/PluginManager.h" 21e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/Section.h" 22e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/StreamFile.h" 23e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/StreamString.h" 24e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/Timer.h" 25e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Core/UUID.h" 26e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#include "lldb/Symbol/ObjectFile.h" 27e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 28e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonstatic uint32_t COFFMachineToMachCPU(uint16_t machine); 29e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 30e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_UNKNOWN 0x0000 31e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_AM33 0x01d3 // Matsushita AM33 32e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_AMD64 0x8664 // x64 33e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_ARM 0x01c0 // ARM little endian 34e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_EBC 0x0ebc // EFI byte code 35e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386 or later processors and compatible processors 36e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel Itanium processor family 37e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_M32R 0x9041 // Mitsubishi M32R little endian 38e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS16 39e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS with FPU 40e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS16 with FPU 41e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_POWERPC 0x01f0 // Power PC little endian 42e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1 // Power PC with floating point support 43e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little endian 44e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_SH3 0x01a2 // Hitachi SH3 45e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3 // Hitachi SH3 DSP 46e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_SH4 0x01a6 // Hitachi SH4 47e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_SH5 0x01a8 // Hitachi SH5 48e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_THUMB 0x01c2 // Thumb 49e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 // MIPS little-endian WCE v2 50e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 51e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 52e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ 53e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_OS2_SIGNATURE 0x454E // NE 54e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE 55e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_NT_SIGNATURE 0x00004550 // PE00 56e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define OPT_HEADER_MAGIC_PE32 0x010b 57e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define OPT_HEADER_MAGIC_PE32_PLUS 0x020b 58e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 59e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 60e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 61e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 62e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 63e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010 64e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 65e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//#define 0x0040 // Reserved 66e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 67e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_32BIT_MACHINE 0x0100 68e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 69e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 70e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 71e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_SYSTEM 0x1000 72e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_DLL 0x2000 73e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 74e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 75e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 76707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton 77707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton// Section Flags 78707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton// The section flags in the Characteristics field of the section header indicate 79707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton// characteristics of the section. 80707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files. 81707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_CNT_CODE 0x00000020 // The section contains executable code. 82707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // The section contains initialized data. 83707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // The section contains uninitialized data. 84707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved for future use. 85707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_INFO 0x00000200 // The section contains comments or other information. The .drectve section has this type. This is valid for object files only. 86707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_REMOVE 0x00000800 // The section will not become part of the image. This is valid only for object files. 87707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_COMDAT 0x00001000 // The section contains COMDAT data. For more information, see section 5.5.6, “COMDAT Sections (Object Only).” This is valid only for object files. 88707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_GPREL 0x00008000 // The section contains data referenced through the global pointer (GP). 89707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 90707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_16BIT 0x00020000 // For ARM machine types, the section contains Thumb code. Reserved for future use with other machine types. 91707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_LOCKED 0x00040000 92707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_PRELOAD 0x00080000 93707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // Align data on a 1-byte boundary. Valid only for object files. 94707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // Align data on a 2-byte boundary. Valid only for object files. 95707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // Align data on a 4-byte boundary. Valid only for object files. 96707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // Align data on an 8-byte boundary. Valid only for object files. 97707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Align data on a 16-byte boundary. Valid only for object files. 98707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // Align data on a 32-byte boundary. Valid only for object files. 99707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // Align data on a 64-byte boundary. Valid only for object files. 100707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_128BYTES 0x00800000 // Align data on a 128-byte boundary. Valid only for object files. 101707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_256BYTES 0x00900000 // Align data on a 256-byte boundary. Valid only for object files. 102707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 // Align data on a 512-byte boundary. Valid only for object files. 103707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 // Align data on a 1024-byte boundary. Valid only for object files. 104707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 // Align data on a 2048-byte boundary. Valid only for object files. 105707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 // Align data on a 4096-byte boundary. Valid only for object files. 106707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 // Align data on an 8192-byte boundary. Valid only for object files. 107707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // The section contains extended relocations. 108707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // The section can be discarded as needed. 109707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // The section cannot be cached. 110707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // The section is not pageable. 111707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_SHARED 0x10000000 // The section can be shared in memory. 112707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // The section can be executed as code. 113707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_READ 0x40000000 // The section can be read. 114707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton#define IMAGE_SCN_MEM_WRITE 0x80000000 // The section can be written to. 115707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton 116e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonusing namespace lldb; 117e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonusing namespace lldb_private; 118e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 119e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid 120e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::Initialize() 121e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 122e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 123e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton GetPluginDescriptionStatic(), 124b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton CreateInstance, 12536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton CreateMemoryInstance, 12636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton GetModuleSpecifications); 127e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 128e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 129e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid 130e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::Terminate() 131e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 132e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton PluginManager::UnregisterPlugin (CreateInstance); 133e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 134e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 135e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 1360e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 137e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetPluginNameStatic() 138e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 1390e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("pe-coff"); 1400e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 141e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 142e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 143e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonconst char * 144e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetPluginDescriptionStatic() 145e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 146e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return "Portable Executable and Common Object File Format object file reader (32 and 64 bit)"; 147e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 148e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 149e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 150e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFile * 151cbe61bd26db663fa3036866dc33315c6ffc37910Greg ClaytonObjectFilePECOFF::CreateInstance (const lldb::ModuleSP &module_sp, 152cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton DataBufferSP& data_sp, 153cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset, 154cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton const lldb_private::FileSpec* file, 155cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t file_offset, 156cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t length) 157e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 158cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (!data_sp) 159e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 160cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_sp = file->MemoryMapFileContents(file_offset, length); 161cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_offset = 0; 162cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton } 163cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton 164cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (ObjectFilePECOFF::MagicBytesMatch(data_sp)) 165cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton { 166cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // Update the data to contain the entire file if it doesn't already 167cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (data_sp->GetByteSize() < length) 168cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_sp = file->MemoryMapFileContents(file_offset, length); 169102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ObjectFile> objfile_ap(new ObjectFilePECOFF (module_sp, data_sp, data_offset, file, file_offset, length)); 170e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (objfile_ap.get() && objfile_ap->ParseHeader()) 171e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return objfile_ap.release(); 172e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 173e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return NULL; 174e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 175e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 176b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile * 1773508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFilePECOFF::CreateMemoryInstance (const lldb::ModuleSP &module_sp, 178b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton lldb::DataBufferSP& data_sp, 179b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton const lldb::ProcessSP &process_sp, 180b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton lldb::addr_t header_addr) 181b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 182b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return NULL; 183b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 184b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 18536b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonsize_t 18636b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFilePECOFF::GetModuleSpecifications (const lldb_private::FileSpec& file, 18736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::DataBufferSP& data_sp, 18836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t data_offset, 18936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t file_offset, 19036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t length, 19136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb_private::ModuleSpecList &specs) 19236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{ 19336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton return 0; 19436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton} 19536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton 19636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton 197e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 198cbe61bd26db663fa3036866dc33315c6ffc37910Greg ClaytonObjectFilePECOFF::MagicBytesMatch (DataBufferSP& data_sp) 199e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 200cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton DataExtractor data(data_sp, eByteOrderLittle, 4); 20136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 202e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton uint16_t magic = data.GetU16 (&offset); 203e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return magic == IMAGE_DOS_SIGNATURE; 204e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 205e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 206e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 2073508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFilePECOFF::ObjectFilePECOFF (const lldb::ModuleSP &module_sp, 208cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton DataBufferSP& data_sp, 209cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset, 210e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton const FileSpec* file, 211cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t file_offset, 212cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t length) : 213cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton ObjectFile (module_sp, file, file_offset, length, data_sp, data_offset), 214e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header (), 215e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header (), 216e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt (), 217e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers () 218e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 219e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton ::memset (&m_dos_header, 0, sizeof(m_dos_header)); 220e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton ::memset (&m_coff_header, 0, sizeof(m_coff_header)); 221e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton ::memset (&m_coff_header_opt, 0, sizeof(m_coff_header_opt)); 222e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 223e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 224e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 225e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::~ObjectFilePECOFF() 226e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 227e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 228e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 229e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 230e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 231e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::ParseHeader () 232e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 2339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ModuleSP module_sp(GetModule()); 2349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (module_sp) 235e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 2369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton lldb_private::Mutex::Locker locker(module_sp->GetMutex()); 2379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton m_sect_headers.clear(); 2389482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton m_data.SetByteOrder (eByteOrderLittle); 23936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 2409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 2419482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (ParseDOSHeader()) 242707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton { 2439482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton offset = m_dos_header.e_lfanew; 2449482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton uint32_t pe_signature = m_data.GetU32 (&offset); 2459482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (pe_signature != IMAGE_NT_SIGNATURE) 2469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton return false; 2479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (ParseCOFFHeader(&offset)) 2489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 2499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_coff_header.hdrsize > 0) 2509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ParseCOFFOptionalHeader(&offset); 2519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ParseSectionHeaders (offset); 2529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 2539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton return true; 254707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton } 255e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 256e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return false; 257e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 258e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 259e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 260e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonByteOrder 261e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetByteOrder () const 262e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 263e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return eByteOrderLittle; 264e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 265e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 266e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 267e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::IsExecutable() const 268e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 269e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return (m_coff_header.flags & IMAGE_FILE_DLL) == 0; 270e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 271e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 27236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonuint32_t 273e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetAddressByteSize () const 274e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 275e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (m_coff_header_opt.magic == OPT_HEADER_MAGIC_PE32_PLUS) 276e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return 8; 277e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton else if (m_coff_header_opt.magic == OPT_HEADER_MAGIC_PE32) 278e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return 4; 279e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return 4; 280e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 281e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 282e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 283e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// NeedsEndianSwap 284e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 285e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Return true if an endian swap needs to occur when extracting data 286e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// from this file. 287e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 288e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 289e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::NeedsEndianSwap() const 290e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 291e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#if defined(__LITTLE_ENDIAN__) 292e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return false; 293e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#else 294e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return true; 295e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton#endif 296e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 297e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 298e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// ParseDOSHeader 299e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 300e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 301e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::ParseDOSHeader () 302e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 303e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton bool success = false; 30436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 305e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton success = m_data.ValidOffsetForDataOfSize(0, sizeof(m_dos_header)); 306e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 307e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (success) 308e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 309e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_magic = m_data.GetU16(&offset); // Magic number 310e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton success = m_dos_header.e_magic == IMAGE_DOS_SIGNATURE; 311e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 312e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (success) 313e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 314e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_cblp = m_data.GetU16(&offset); // Bytes on last page of file 315e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_cp = m_data.GetU16(&offset); // Pages in file 316e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_crlc = m_data.GetU16(&offset); // Relocations 317e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_cparhdr = m_data.GetU16(&offset); // Size of header in paragraphs 318e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_minalloc = m_data.GetU16(&offset); // Minimum extra paragraphs needed 319e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_maxalloc = m_data.GetU16(&offset); // Maximum extra paragraphs needed 320e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_ss = m_data.GetU16(&offset); // Initial (relative) SS value 321e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_sp = m_data.GetU16(&offset); // Initial SP value 322e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_csum = m_data.GetU16(&offset); // Checksum 323e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_ip = m_data.GetU16(&offset); // Initial IP value 324e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_cs = m_data.GetU16(&offset); // Initial (relative) CS value 325e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_lfarlc = m_data.GetU16(&offset); // File address of relocation table 326e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_ovno = m_data.GetU16(&offset); // Overlay number 327e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 328e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res[0] = m_data.GetU16(&offset); // Reserved words 329e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res[1] = m_data.GetU16(&offset); // Reserved words 330e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res[2] = m_data.GetU16(&offset); // Reserved words 331e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res[3] = m_data.GetU16(&offset); // Reserved words 332e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 333e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_oemid = m_data.GetU16(&offset); // OEM identifier (for e_oeminfo) 334e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_oeminfo = m_data.GetU16(&offset); // OEM information; e_oemid specific 335e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[0] = m_data.GetU16(&offset); // Reserved words 336e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[1] = m_data.GetU16(&offset); // Reserved words 337e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[2] = m_data.GetU16(&offset); // Reserved words 338e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[3] = m_data.GetU16(&offset); // Reserved words 339e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[4] = m_data.GetU16(&offset); // Reserved words 340e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[5] = m_data.GetU16(&offset); // Reserved words 341e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[6] = m_data.GetU16(&offset); // Reserved words 342e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[7] = m_data.GetU16(&offset); // Reserved words 343e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[8] = m_data.GetU16(&offset); // Reserved words 344e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_res2[9] = m_data.GetU16(&offset); // Reserved words 345e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 346e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_dos_header.e_lfanew = m_data.GetU32(&offset); // File address of new exe header 347e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 348e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 349e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (!success) 350e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton memset(&m_dos_header, 0, sizeof(m_dos_header)); 351e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return success; 352e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 353e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 354e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 355e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 356e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// ParserCOFFHeader 357e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 358e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 35936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonObjectFilePECOFF::ParseCOFFHeader(lldb::offset_t *offset_ptr) 360e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 361e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton bool success = m_data.ValidOffsetForDataOfSize (*offset_ptr, sizeof(m_coff_header)); 362e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (success) 363e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 364e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header.machine = m_data.GetU16(offset_ptr); 365e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header.nsects = m_data.GetU16(offset_ptr); 366e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header.modtime = m_data.GetU32(offset_ptr); 367e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header.symoff = m_data.GetU32(offset_ptr); 368e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header.nsyms = m_data.GetU32(offset_ptr); 369e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header.hdrsize = m_data.GetU16(offset_ptr); 370e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header.flags = m_data.GetU16(offset_ptr); 371e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 372e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (!success) 373e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton memset(&m_coff_header, 0, sizeof(m_coff_header)); 374e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return success; 375e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 376e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 377e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 37836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonObjectFilePECOFF::ParseCOFFOptionalHeader(lldb::offset_t *offset_ptr) 379e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 380e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton bool success = false; 38136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const lldb::offset_t end_offset = *offset_ptr + m_coff_header.hdrsize; 382e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (*offset_ptr < end_offset) 383e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 384e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton success = true; 385e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.magic = m_data.GetU16(offset_ptr); 386e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.major_linker_version = m_data.GetU8 (offset_ptr); 387e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.minor_linker_version = m_data.GetU8 (offset_ptr); 388e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.code_size = m_data.GetU32(offset_ptr); 389e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.data_size = m_data.GetU32(offset_ptr); 390e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.bss_size = m_data.GetU32(offset_ptr); 391e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.entry = m_data.GetU32(offset_ptr); 392e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.code_offset = m_data.GetU32(offset_ptr); 393e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 394e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton const uint32_t addr_byte_size = GetAddressByteSize (); 395e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 396e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (*offset_ptr < end_offset) 397e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 398e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (m_coff_header_opt.magic == OPT_HEADER_MAGIC_PE32) 399e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 400e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton // PE32 only 401e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.data_offset = m_data.GetU32(offset_ptr); 402e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 403e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton else 404e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.data_offset = 0; 405e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 406e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (*offset_ptr < end_offset) 407e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 408e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.image_base = m_data.GetMaxU64 (offset_ptr, addr_byte_size); 409e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.sect_alignment = m_data.GetU32(offset_ptr); 410e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.file_alignment = m_data.GetU32(offset_ptr); 411e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.major_os_system_version = m_data.GetU16(offset_ptr); 412e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.minor_os_system_version = m_data.GetU16(offset_ptr); 413e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.major_image_version = m_data.GetU16(offset_ptr); 414e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.minor_image_version = m_data.GetU16(offset_ptr); 415e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.major_subsystem_version = m_data.GetU16(offset_ptr); 416e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.minor_subsystem_version = m_data.GetU16(offset_ptr); 417e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.reserved1 = m_data.GetU32(offset_ptr); 418e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.image_size = m_data.GetU32(offset_ptr); 419e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.header_size = m_data.GetU32(offset_ptr); 420707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton m_coff_header_opt.checksum = m_data.GetU32(offset_ptr); 421e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.subsystem = m_data.GetU16(offset_ptr); 422e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.dll_flags = m_data.GetU16(offset_ptr); 423e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.stack_reserve_size = m_data.GetMaxU64 (offset_ptr, addr_byte_size); 424e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.stack_commit_size = m_data.GetMaxU64 (offset_ptr, addr_byte_size); 425e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.heap_reserve_size = m_data.GetMaxU64 (offset_ptr, addr_byte_size); 426e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.heap_commit_size = m_data.GetMaxU64 (offset_ptr, addr_byte_size); 427e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.loader_flags = m_data.GetU32(offset_ptr); 428e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton uint32_t num_data_dir_entries = m_data.GetU32(offset_ptr); 429e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.data_dirs.clear(); 430e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.data_dirs.resize(num_data_dir_entries); 431e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton uint32_t i; 432e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton for (i=0; i<num_data_dir_entries; i++) 433e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 434e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.data_dirs[i].vmaddr = m_data.GetU32(offset_ptr); 435e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_coff_header_opt.data_dirs[i].vmsize = m_data.GetU32(offset_ptr); 436e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 437e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 438e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 439e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 440e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton // Make sure we are on track for section data which follows 441e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton *offset_ptr = end_offset; 442e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return success; 443e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 444e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 445e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 446e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 447e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// ParseSectionHeaders 448e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 449e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 450e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::ParseSectionHeaders (uint32_t section_header_data_offset) 451e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 452e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton const uint32_t nsects = m_coff_header.nsects; 453e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers.clear(); 454e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 455e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (nsects > 0) 456e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 457e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton const uint32_t addr_byte_size = GetAddressByteSize (); 458e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton const size_t section_header_byte_size = nsects * sizeof(section_header_t); 459e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton DataBufferSP section_header_data_sp(m_file.ReadFileContents (section_header_data_offset, section_header_byte_size)); 460e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton DataExtractor section_header_data (section_header_data_sp, GetByteOrder(), addr_byte_size); 461e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 46236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 463e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (section_header_data.ValidOffsetForDataOfSize (offset, section_header_byte_size)) 464e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 465e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers.resize(nsects); 466e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 467e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton for (uint32_t idx = 0; idx<nsects; ++idx) 468e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 469e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton const void *name_data = section_header_data.GetData(&offset, 8); 470e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (name_data) 471e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 472e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton memcpy(m_sect_headers[idx].name, name_data, 8); 473e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].vmsize = section_header_data.GetU32(&offset); 474e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].vmaddr = section_header_data.GetU32(&offset); 475e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].size = section_header_data.GetU32(&offset); 476e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].offset = section_header_data.GetU32(&offset); 477e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].reloff = section_header_data.GetU32(&offset); 478e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].lineoff = section_header_data.GetU32(&offset); 479e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].nreloc = section_header_data.GetU16(&offset); 480e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].nline = section_header_data.GetU16(&offset); 481e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton m_sect_headers[idx].flags = section_header_data.GetU32(&offset); 482e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 483e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 484e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 485e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 486e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 487e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return m_sect_headers.empty() == false; 488e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 489e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 490e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 491e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetSectionName(std::string& sect_name, const section_header_t& sect) 492e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 493e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (sect.name[0] == '/') 494e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 49536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t stroff = strtoul(§.name[1], NULL, 10); 49636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t string_file_offset = m_coff_header.symoff + (m_coff_header.nsyms * 18) + stroff; 497e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton const char *name = m_data.GetCStr (&string_file_offset); 498e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (name) 499e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 500e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sect_name = name; 501e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return true; 502e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 503e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 504e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return false; 505e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 506e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sect_name = sect.name; 507e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return true; 508e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 509e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 510e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 511e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// GetNListSymtab 512e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 513e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonSymtab * 5147940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFilePECOFF::GetSymtab() 515e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 5169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ModuleSP module_sp(GetModule()); 5179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (module_sp) 518e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 5199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton lldb_private::Mutex::Locker locker(module_sp->GetMutex()); 5209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_symtab_ap.get() == NULL) 521e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 5229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton SectionList *sect_list = GetSectionList(); 5239482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton m_symtab_ap.reset(new Symtab(this)); 5249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton Mutex::Locker symtab_locker (m_symtab_ap->GetMutex()); 5259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 5269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton const uint32_t num_syms = m_coff_header.nsyms; 5279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 5289482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (num_syms > 0 && m_coff_header.symoff > 0) 529e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 5302856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton const uint32_t symbol_size = 18; 5319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton const uint32_t addr_byte_size = GetAddressByteSize (); 5329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton const size_t symbol_data_size = num_syms * symbol_size; 5339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // Include the 4 bytes string table size at the end of the symbols 5349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton DataBufferSP symtab_data_sp(m_file.ReadFileContents (m_coff_header.symoff, symbol_data_size + 4)); 5359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton DataExtractor symtab_data (symtab_data_sp, GetByteOrder(), addr_byte_size); 53636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = symbol_data_size; 5379482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton const uint32_t strtab_size = symtab_data.GetU32 (&offset); 5382856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton DataBufferSP strtab_data_sp(m_file.ReadFileContents (m_coff_header.symoff + symbol_data_size, strtab_size)); 5399482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton DataExtractor strtab_data (strtab_data_sp, GetByteOrder(), addr_byte_size); 5409482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 5412856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton // First 4 bytes should be zeroed after strtab_size has been read, 5422856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton // because it is used as offset 0 to encode a NULL string. 5432856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton uint32_t* strtab_data_start = (uint32_t*)strtab_data_sp->GetBytes(); 5442856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton strtab_data_start[0] = 0; 5452856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton 5469482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton offset = 0; 5479482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton std::string symbol_name; 5489482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton Symbol *symbols = m_symtab_ap->Resize (num_syms); 5499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton for (uint32_t i=0; i<num_syms; ++i) 550707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton { 5519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton coff_symbol_t symbol; 5529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton const uint32_t symbol_offset = offset; 5539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton const char *symbol_name_cstr = NULL; 5549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // If the first 4 bytes of the symbol string are zero, then we 5559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // it is followed by a 4 byte string table offset. Else these 5569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // 8 bytes contain the symbol name 5579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (symtab_data.GetU32 (&offset) == 0) 5589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 5599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // Long string that doesn't fit into the symbol table name, 5609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // so now we must read the 4 byte string table offset 5619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton uint32_t strtab_offset = symtab_data.GetU32 (&offset); 5629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol_name_cstr = strtab_data.PeekCStr (strtab_offset); 5639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol_name.assign (symbol_name_cstr); 5649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 5659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else 5669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 5679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // Short string that fits into the symbol table name which is 8 bytes 5689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton offset += sizeof(symbol.name) - 4; // Skip remaining 5699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol_name_cstr = symtab_data.PeekCStr (symbol_offset); 5709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (symbol_name_cstr == NULL) 5719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton break; 5729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol_name.assign (symbol_name_cstr, sizeof(symbol.name)); 5739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 5749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol.value = symtab_data.GetU32 (&offset); 5759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol.sect = symtab_data.GetU16 (&offset); 5769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol.type = symtab_data.GetU16 (&offset); 5779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol.storage = symtab_data.GetU8 (&offset); 5789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton symbol.naux = symtab_data.GetU8 (&offset); 579c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton symbols[i].GetMangled ().SetValue (ConstString(symbol_name.c_str())); 5802856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton if ((int16_t)symbol.sect >= 1) 5812856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton { 5822856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton Address symbol_addr(sect_list->GetSectionAtIndex(symbol.sect-1), symbol.value); 5832856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton symbols[i].GetAddress() = symbol_addr; 5842856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton } 5859482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 5869482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (symbol.naux > 0) 5872856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton { 5889482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton i += symbol.naux; 5892856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton offset += symbol_size; 5902856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton } 591707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton } 5929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 593e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 594e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 595e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 596e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return m_symtab_ap.get(); 597e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 598e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 599e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 6007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Claytonbool 6017940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFilePECOFF::IsStripped () 602e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 6037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // TODO: determine this for COFF 6047940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return false; 6057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton} 6067940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 6077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 6087940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 6097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Claytonvoid 6107940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFilePECOFF::CreateSections (SectionList &unified_section_list) 6117940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton{ 6127940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!m_sections_ap.get()) 613e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 6147940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_sections_ap.reset(new SectionList()); 6157940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 6167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton ModuleSP module_sp(GetModule()); 6177940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (module_sp) 618e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 6197940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton lldb_private::Mutex::Locker locker(module_sp->GetMutex()); 6209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton const uint32_t nsects = m_sect_headers.size(); 6219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ModuleSP module_sp (GetModule()); 6229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton for (uint32_t idx = 0; idx<nsects; ++idx) 623707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton { 6249482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton std::string sect_name; 6259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton GetSectionName (sect_name, m_sect_headers[idx]); 6269482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ConstString const_sect_name (sect_name.c_str()); 6279482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_code_sect_name (".code"); 6289482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_CODE_sect_name ("CODE"); 6299482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_data_sect_name (".data"); 6309482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_DATA_sect_name ("DATA"); 6319482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_bss_sect_name (".bss"); 6329482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_BSS_sect_name ("BSS"); 6339482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_debug_sect_name (".debug"); 6349482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_reloc_sect_name (".reloc"); 6359482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_stab_sect_name (".stab"); 6369482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton static ConstString g_stabstr_sect_name (".stabstr"); 6372856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev"); 6382856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges"); 6392856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_frame (".debug_frame"); 6402856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_info (".debug_info"); 6412856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_line (".debug_line"); 6422856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_loc (".debug_loc"); 6432856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo"); 6442856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames"); 6452856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes"); 6462856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges"); 6472856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_dwarf_debug_str (".debug_str"); 6482856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton static ConstString g_sect_name_eh_frame (".eh_frame"); 6499482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton SectionType section_type = eSectionTypeOther; 6509482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_CODE && 6519482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ((const_sect_name == g_code_sect_name) || (const_sect_name == g_CODE_sect_name))) 6529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 6539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeCode; 6549482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 6559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_INITIALIZED_DATA && 6569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ((const_sect_name == g_data_sect_name) || (const_sect_name == g_DATA_sect_name))) 6579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 658707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton section_type = eSectionTypeData; 6599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 6609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA && 6619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ((const_sect_name == g_bss_sect_name) || (const_sect_name == g_BSS_sect_name))) 6629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 6639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_sect_headers[idx].size == 0) 6649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeZeroFill; 6659482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else 6669482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeData; 6679482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 6689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else if (const_sect_name == g_debug_sect_name) 6699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 6709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeDebug; 6719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 6729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else if (const_sect_name == g_stabstr_sect_name) 6739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 6749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeDataCString; 6759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 6769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else if (const_sect_name == g_reloc_sect_name) 6779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 6789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeOther; 6799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 6802856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_abbrev) section_type = eSectionTypeDWARFDebugAbbrev; 6812856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_aranges) section_type = eSectionTypeDWARFDebugAranges; 6822856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_frame) section_type = eSectionTypeDWARFDebugFrame; 6832856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_info) section_type = eSectionTypeDWARFDebugInfo; 6842856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_line) section_type = eSectionTypeDWARFDebugLine; 6852856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_loc) section_type = eSectionTypeDWARFDebugLoc; 6862856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_macinfo) section_type = eSectionTypeDWARFDebugMacInfo; 6872856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_pubnames) section_type = eSectionTypeDWARFDebugPubNames; 6882856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_pubtypes) section_type = eSectionTypeDWARFDebugPubTypes; 6892856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_ranges) section_type = eSectionTypeDWARFDebugRanges; 6902856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_dwarf_debug_str) section_type = eSectionTypeDWARFDebugStr; 6912856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton else if (const_sect_name == g_sect_name_eh_frame) section_type = eSectionTypeEHFrame; 6929482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_CODE) 6939482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 6949482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeCode; 6959482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 6969482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_INITIALIZED_DATA) 6979482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 698707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton section_type = eSectionTypeData; 6999482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 7009482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else if (m_sect_headers[idx].flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) 7019482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 7029482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_sect_headers[idx].size == 0) 7039482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeZeroFill; 7049482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton else 7059482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton section_type = eSectionTypeData; 7069482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 707707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton 7089482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // Use a segment ID of the segment index shifted left by 8 so they 7099482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton // never conflict with any of the sections. 7109482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton SectionSP section_sp (new Section (module_sp, // Module to which this section belongs 711a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain this, // Object file to which this section belongs 7129482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton idx + 1, // Section ID is the 1 based segment index shifted right by 8 bits as not to collide with any of the 256 section IDs that are possible 7139482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton const_sect_name, // Name of this section 714a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain section_type, // This section is a container of other sections. 7152856e76ca3ed09b0dadeb0486382fdf1ea3577a4Greg Clayton m_coff_header_opt.image_base + m_sect_headers[idx].vmaddr, // File VM address == addresses as they are found in the object file 7169482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton m_sect_headers[idx].vmsize, // VM size in bytes of this section 7179482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton m_sect_headers[idx].offset, // Offset to the data for this section in the file 7189482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton m_sect_headers[idx].size, // Size in bytes of this section as found in the the file 7199482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton m_sect_headers[idx].flags)); // Flags for this section 7209482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 7219482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton //section_sp->SetIsEncrypted (segment_is_encrypted); 7229482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 7237940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton unified_section_list.AddSection(section_sp); 7247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_sections_ap->AddSection (section_sp); 7259482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 726e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 727e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 728e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 729e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 730e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 731e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetUUID (UUID* uuid) 732e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 733e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return false; 734e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 735e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 736e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonuint32_t 737e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetDependentModules (FileSpecList& files) 738e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 739e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return 0; 740e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 741e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 742e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 743e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 744e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump 745e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 746e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump the specifics of the runtime file container (such as any headers 747e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// segments, sections, etc). 748e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 749e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid 750e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::Dump(Stream *s) 751e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 7529482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ModuleSP module_sp(GetModule()); 7539482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (module_sp) 754e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 7559482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton lldb_private::Mutex::Locker locker(module_sp->GetMutex()); 7569482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton s->Printf("%p: ", this); 7579482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton s->Indent(); 7589482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton s->PutCString("ObjectFilePECOFF"); 7599482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 7609482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton ArchSpec header_arch; 7619482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton GetArchitecture (header_arch); 7629482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 7639482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton *s << ", file = '" << m_file << "', arch = " << header_arch.GetArchitectureName() << "\n"; 7649482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 7657940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *sections = GetSectionList(); 7667940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (sections) 7677940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton sections->Dump(s, NULL, true, UINT32_MAX); 7689482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 7699482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_symtab_ap.get()) 7709482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton m_symtab_ap->Dump(s, NULL, eSortOrderNone); 7719482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton 7729482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_dos_header.e_magic) 7739482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton DumpDOSHeader (s, m_dos_header); 7749482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_coff_header.machine) 7759482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton { 7769482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton DumpCOFFHeader (s, m_coff_header); 7779482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton if (m_coff_header.hdrsize) 7789482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton DumpOptCOFFHeader (s, m_coff_header_opt); 7799482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton } 7809482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton s->EOL(); 7819482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton DumpSectionHeaders(s); 7829482f05e109d617061c1ade6d9672dfcb8427547Greg Clayton s->EOL(); 783e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 784e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 785e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 786e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 787e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpDOSHeader 788e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 789e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump the MS-DOS header to the specified output stream 790e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 791e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid 792e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpDOSHeader(Stream *s, const dos_header_t& header) 793e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 794e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->PutCString ("MSDOS Header\n"); 795e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_magic = 0x%4.4x\n", header.e_magic); 796e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_cblp = 0x%4.4x\n", header.e_cblp); 797e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_cp = 0x%4.4x\n", header.e_cp); 798e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_crlc = 0x%4.4x\n", header.e_crlc); 799e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_cparhdr = 0x%4.4x\n", header.e_cparhdr); 800e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_minalloc = 0x%4.4x\n", header.e_minalloc); 801e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_maxalloc = 0x%4.4x\n", header.e_maxalloc); 802e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_ss = 0x%4.4x\n", header.e_ss); 803e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_sp = 0x%4.4x\n", header.e_sp); 804e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_csum = 0x%4.4x\n", header.e_csum); 805e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_ip = 0x%4.4x\n", header.e_ip); 806e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_cs = 0x%4.4x\n", header.e_cs); 807e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_lfarlc = 0x%4.4x\n", header.e_lfarlc); 808e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_ovno = 0x%4.4x\n", header.e_ovno); 809e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_res[4] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n", 810e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res[0], 811e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res[1], 812e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res[2], 813e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res[3]); 814e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_oemid = 0x%4.4x\n", header.e_oemid); 815e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_oeminfo = 0x%4.4x\n", header.e_oeminfo); 816e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_res2[10] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n", 817e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[0], 818e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[1], 819e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[2], 820e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[3], 821e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[4], 822e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[5], 823e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[6], 824e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[7], 825e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[8], 826e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.e_res2[9]); 827e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" e_lfanew = 0x%8.8x\n", header.e_lfanew); 828e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 829e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 830e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 831e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpCOFFHeader 832e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 833e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump the COFF header to the specified output stream 834e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 835e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid 836e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpCOFFHeader(Stream *s, const coff_header_t& header) 837e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 838e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->PutCString ("COFF Header\n"); 839e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" machine = 0x%4.4x\n", header.machine); 840e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" nsects = 0x%4.4x\n", header.nsects); 841e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" modtime = 0x%8.8x\n", header.modtime); 842e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" symoff = 0x%8.8x\n", header.symoff); 843e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" nsyms = 0x%8.8x\n", header.nsyms); 844e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" hdrsize = 0x%4.4x\n", header.hdrsize); 845e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 846e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 847e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 848e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpOptCOFFHeader 849e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 850e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump the optional COFF header to the specified output stream 851e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 852e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid 853e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpOptCOFFHeader(Stream *s, const coff_opt_header_t& header) 854e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 855e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->PutCString ("Optional COFF Header\n"); 856e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" magic = 0x%4.4x\n", header.magic); 857e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" major_linker_version = 0x%2.2x\n", header.major_linker_version); 858e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" minor_linker_version = 0x%2.2x\n", header.minor_linker_version); 859e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" code_size = 0x%8.8x\n", header.code_size); 860e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" data_size = 0x%8.8x\n", header.data_size); 861e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" bss_size = 0x%8.8x\n", header.bss_size); 862e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" entry = 0x%8.8x\n", header.entry); 863e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" code_offset = 0x%8.8x\n", header.code_offset); 864e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" data_offset = 0x%8.8x\n", header.data_offset); 8655f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf (" image_base = 0x%16.16" PRIx64 "\n", header.image_base); 866e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" sect_alignment = 0x%8.8x\n", header.sect_alignment); 867e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" file_alignment = 0x%8.8x\n", header.file_alignment); 868e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" major_os_system_version = 0x%4.4x\n", header.major_os_system_version); 869e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" minor_os_system_version = 0x%4.4x\n", header.minor_os_system_version); 870e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" major_image_version = 0x%4.4x\n", header.major_image_version); 871e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" minor_image_version = 0x%4.4x\n", header.minor_image_version); 872e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" major_subsystem_version = 0x%4.4x\n", header.major_subsystem_version); 873e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" minor_subsystem_version = 0x%4.4x\n", header.minor_subsystem_version); 874e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" reserved1 = 0x%8.8x\n", header.reserved1); 875e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" image_size = 0x%8.8x\n", header.image_size); 876e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" header_size = 0x%8.8x\n", header.header_size); 877707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton s->Printf (" checksum = 0x%8.8x\n", header.checksum); 878e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" subsystem = 0x%4.4x\n", header.subsystem); 879e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" dll_flags = 0x%4.4x\n", header.dll_flags); 8805f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf (" stack_reserve_size = 0x%16.16" PRIx64 "\n", header.stack_reserve_size); 8815f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf (" stack_commit_size = 0x%16.16" PRIx64 "\n", header.stack_commit_size); 8825f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf (" heap_reserve_size = 0x%16.16" PRIx64 "\n", header.heap_reserve_size); 8835f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf (" heap_commit_size = 0x%16.16" PRIx64 "\n", header.heap_commit_size); 884e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" loader_flags = 0x%8.8x\n", header.loader_flags); 885e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf (" num_data_dir_entries = 0x%8.8zx\n", header.data_dirs.size()); 886e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton uint32_t i; 887e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton for (i=0; i<header.data_dirs.size(); i++) 888e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 889707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton s->Printf (" data_dirs[%2u] vmaddr = 0x%8.8x, vmsize = 0x%8.8x\n", 890e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton i, 891e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.data_dirs[i].vmaddr, 892e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton header.data_dirs[i].vmsize); 893e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 894e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 895e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 896e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpSectionHeader 897e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 898e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump a single ELF section header to the specified output stream 899e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 900e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid 901e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpSectionHeader(Stream *s, const section_header_t& sh) 902e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 903e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton std::string name; 904e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton GetSectionName(name, sh); 905e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->Printf ("%-16s 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%4.4x 0x%4.4x 0x%8.8x\n", 906e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton name.c_str(), 907e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sh.vmaddr, 908707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton sh.vmsize, 909e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sh.offset, 910707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton sh.size, 911e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sh.reloff, 912e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sh.lineoff, 913e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sh.nreloc, 914e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sh.nline, 915e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton sh.flags); 916e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 917e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 918e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 919e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 920e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// DumpSectionHeaders 921e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// 922e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// Dump all of the ELF section header to the specified output stream 923e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//---------------------------------------------------------------------- 924e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonvoid 925e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::DumpSectionHeaders(Stream *s) 926e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 927e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 928e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton s->PutCString ("Section Headers\n"); 929707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton s->PutCString ("IDX name vm addr vm size file off file size reloc off line off nreloc nline flags\n"); 930707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton s->PutCString ("==== ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ------ ------ ----------\n"); 931e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 932e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton uint32_t idx = 0; 933e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton SectionHeaderCollIter pos, end = m_sect_headers.end(); 934e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 935e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton for (pos = m_sect_headers.begin(); pos != end; ++pos, ++idx) 936e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 937707e340b5d5c302ec72cbf4d922cebac0643ed91Greg Clayton s->Printf ("[%2u] ", idx); 938e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton ObjectFilePECOFF::DumpSectionHeader(s, *pos); 939e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 940e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 941e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 942e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonstatic bool 943e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonCOFFMachineToMachCPU (uint16_t machine, ArchSpec &arch) 944e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 945e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton switch (machine) 946e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 947e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton case IMAGE_FILE_MACHINE_AMD64: 948e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton case IMAGE_FILE_MACHINE_IA64: 949e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton arch.SetArchitecture (eArchTypeMachO, 950e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton llvm::MachO::CPUTypeX86_64, 951e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton llvm::MachO::CPUSubType_X86_64_ALL); 952e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return true; 953e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 954e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton case IMAGE_FILE_MACHINE_I386: 955e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton arch.SetArchitecture (eArchTypeMachO, 956e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton llvm::MachO::CPUTypeI386, 957e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton llvm::MachO::CPUSubType_I386_ALL); 958e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return true; 959e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 960e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton case IMAGE_FILE_MACHINE_POWERPC: 961e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton case IMAGE_FILE_MACHINE_POWERPCFP: 962e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton arch.SetArchitecture (eArchTypeMachO, 963e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton llvm::MachO::CPUTypePowerPC, 964e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton llvm::MachO::CPUSubType_POWERPC_ALL); 965e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return true; 966e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton case IMAGE_FILE_MACHINE_ARM: 967e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton case IMAGE_FILE_MACHINE_THUMB: 968e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton arch.SetArchitecture (eArchTypeMachO, 969e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton llvm::MachO::CPUTypeARM, 970e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton llvm::MachO::CPUSubType_ARM_V7); 971e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return true; 972e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 973e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return false; 974e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 975e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonbool 976e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetArchitecture (ArchSpec &arch) 977e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 978e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton // For index zero return our cpu type 979e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return COFFMachineToMachCPU (m_coff_header.machine, arch); 980e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 981e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 982e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFile::Type 983e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::CalculateType() 984e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 985e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if (m_coff_header.machine != 0) 986e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton { 987e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton if ((m_coff_header.flags & IMAGE_FILE_DLL) == 0) 988e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return eTypeExecutable; 989e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton else 990e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return eTypeSharedLibrary; 991e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton } 992e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return eTypeExecutable; 993e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 994e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 995e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFile::Strata 996e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::CalculateStrata() 997e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 998e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return eStrataUser; 999e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 1000e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//------------------------------------------------------------------ 1001e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton// PluginInterface protocol 1002e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton//------------------------------------------------------------------ 10030e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 1004e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetPluginName() 1005e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 1006e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return GetPluginNameStatic(); 1007e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 1008e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 1009e9f4982716a8b91007af2637bd32e8661e3a9103Greg Claytonuint32_t 1010e9f4982716a8b91007af2637bd32e8661e3a9103Greg ClaytonObjectFilePECOFF::GetPluginVersion() 1011e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton{ 1012e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton return 1; 1013e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton} 1014e9f4982716a8b91007af2637bd32e8661e3a9103Greg Clayton 1015