diff options
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/PECOFF')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp | 35 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h | 16 |
2 files changed, 34 insertions, 17 deletions
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp index 6bfe69503e9..78af6619975 100644 --- a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp +++ b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp @@ -145,11 +145,25 @@ ObjectFilePECOFF::GetPluginDescriptionStatic() ObjectFile * -ObjectFilePECOFF::CreateInstance (const lldb::ModuleSP &module_sp, DataBufferSP& dataSP, const FileSpec* file, addr_t offset, addr_t length) -{ - if (ObjectFilePECOFF::MagicBytesMatch(dataSP)) +ObjectFilePECOFF::CreateInstance (const lldb::ModuleSP &module_sp, + DataBufferSP& data_sp, + lldb::offset_t data_offset, + const lldb_private::FileSpec* file, + lldb::offset_t file_offset, + lldb::offset_t length) +{ + if (!data_sp) + { + data_sp = file->MemoryMapFileContents(file_offset, length); + data_offset = 0; + } + + if (ObjectFilePECOFF::MagicBytesMatch(data_sp)) { - std::auto_ptr<ObjectFile> objfile_ap(new ObjectFilePECOFF (module_sp, dataSP, file, offset, length)); + // Update the data to contain the entire file if it doesn't already + if (data_sp->GetByteSize() < length) + data_sp = file->MemoryMapFileContents(file_offset, length); + std::auto_ptr<ObjectFile> objfile_ap(new ObjectFilePECOFF (module_sp, data_sp, data_offset, file, file_offset, length)); if (objfile_ap.get() && objfile_ap->ParseHeader()) return objfile_ap.release(); } @@ -166,9 +180,9 @@ ObjectFilePECOFF::CreateMemoryInstance (const lldb::ModuleSP &module_sp, } bool -ObjectFilePECOFF::MagicBytesMatch (DataBufferSP& dataSP) +ObjectFilePECOFF::MagicBytesMatch (DataBufferSP& data_sp) { - DataExtractor data(dataSP, eByteOrderLittle, 4); + DataExtractor data(data_sp, eByteOrderLittle, 4); lldb::offset_t offset = 0; uint16_t magic = data.GetU16 (&offset); return magic == IMAGE_DOS_SIGNATURE; @@ -176,11 +190,12 @@ ObjectFilePECOFF::MagicBytesMatch (DataBufferSP& dataSP) ObjectFilePECOFF::ObjectFilePECOFF (const lldb::ModuleSP &module_sp, - DataBufferSP& dataSP, + DataBufferSP& data_sp, + lldb::offset_t data_offset, const FileSpec* file, - addr_t offset, - addr_t length) : - ObjectFile (module_sp, file, offset, length, dataSP), + lldb::offset_t file_offset, + lldb::offset_t length) : + ObjectFile (module_sp, file, file_offset, length, data_sp, data_offset), m_dos_header (), m_coff_header (), m_coff_header_opt (), diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h index 446999c6c84..aad2696b2ef 100644 --- a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h +++ b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h @@ -36,10 +36,11 @@ public: static ObjectFile * CreateInstance (const lldb::ModuleSP &module_sp, - lldb::DataBufferSP& dataSP, + lldb::DataBufferSP& data_sp, + lldb::offset_t data_offset, const lldb_private::FileSpec* file, - lldb::addr_t offset, - lldb::addr_t length); + lldb::offset_t offset, + lldb::offset_t length); static lldb_private::ObjectFile * CreateMemoryInstance (const lldb::ModuleSP &module_sp, @@ -47,14 +48,15 @@ public: const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); static bool - MagicBytesMatch (lldb::DataBufferSP& dataSP); + MagicBytesMatch (lldb::DataBufferSP& data_sp); ObjectFilePECOFF (const lldb::ModuleSP &module_sp, - lldb::DataBufferSP& dataSP, + lldb::DataBufferSP& data_sp, + lldb::offset_t data_offset, const lldb_private::FileSpec* file, - lldb::addr_t offset, - lldb::addr_t length); + lldb::offset_t file_offset, + lldb::offset_t length); virtual ~ObjectFilePECOFF(); |