summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/ObjectFile
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/ObjectFile')
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp29
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp52
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h4
3 files changed, 30 insertions, 55 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 1cd8c3b34ae..81126f637f9 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -473,15 +473,11 @@ ObjectFileELF::ParseProgramHeaders()
return 0;
const size_t ph_size = m_header.e_phnum * m_header.e_phentsize;
- const elf_off ph_offset = m_offset + m_header.e_phoff;
- DataBufferSP buffer_sp(m_file.ReadFileContents(ph_offset, ph_size));
-
- if (buffer_sp.get() == NULL || buffer_sp->GetByteSize() != ph_size)
+ const elf_off ph_offset = m_header.e_phoff;
+ DataExtractor data;
+ if (GetData (ph_offset, ph_size, data) != ph_size)
return 0;
- DataExtractor data(buffer_sp, m_data.GetByteOrder(),
- m_data.GetAddressByteSize());
-
uint32_t idx;
uint32_t offset;
for (idx = 0, offset = 0; idx < m_header.e_phnum; ++idx)
@@ -515,16 +511,11 @@ ObjectFileELF::ParseSectionHeaders()
return 0;
const size_t sh_size = m_header.e_shnum * m_header.e_shentsize;
- const elf_off sh_offset = m_offset + m_header.e_shoff;
- DataBufferSP buffer_sp(m_file.ReadFileContents(sh_offset, sh_size));
-
- if (buffer_sp.get() == NULL || buffer_sp->GetByteSize() != sh_size)
+ const elf_off sh_offset = m_header.e_shoff;
+ DataExtractor data;
+ if (GetData (sh_offset, sh_size, data) != sh_size)
return 0;
- DataExtractor data(buffer_sp,
- m_data.GetByteOrder(),
- m_data.GetAddressByteSize());
-
uint32_t idx;
uint32_t offset;
for (idx = 0, offset = 0; idx < m_header.e_shnum; ++idx)
@@ -549,13 +540,11 @@ ObjectFileELF::GetSectionHeaderStringTable()
{
const ELFSectionHeader &sheader = m_section_headers[strtab_idx];
const size_t byte_size = sheader.sh_size;
- const Elf64_Off offset = m_offset + sheader.sh_offset;
- DataBufferSP buffer_sp(m_file.ReadFileContents(offset, byte_size));
+ const Elf64_Off offset = sheader.sh_offset;
+ m_shstr_data.SetData (m_data, offset, byte_size);
- if (buffer_sp.get() == NULL || buffer_sp->GetByteSize() != byte_size)
+ if (m_shstr_data.GetByteSize() != byte_size)
return 0;
-
- m_shstr_data.SetData(buffer_sp);
}
}
return m_shstr_data.GetByteSize();
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index e202b61b8f6..de889ee97f0 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -63,11 +63,11 @@ ObjectFileMachO::GetPluginDescriptionStatic()
ObjectFile *
-ObjectFileMachO::CreateInstance (Module* module, DataBufferSP& dataSP, const FileSpec* file, addr_t offset, addr_t length)
+ObjectFileMachO::CreateInstance (Module* module, DataBufferSP& data_sp, const FileSpec* file, addr_t offset, addr_t length)
{
- if (ObjectFileMachO::MagicBytesMatch(dataSP))
+ if (ObjectFileMachO::MagicBytesMatch(data_sp, offset, length))
{
- std::auto_ptr<ObjectFile> objfile_ap(new ObjectFileMachO (module, dataSP, file, offset, length));
+ std::auto_ptr<ObjectFile> objfile_ap(new ObjectFileMachO (module, data_sp, file, offset, length));
if (objfile_ap.get() && objfile_ap->ParseHeader())
return objfile_ap.release();
}
@@ -97,17 +97,20 @@ MachHeaderSizeFromMagic(uint32_t magic)
bool
-ObjectFileMachO::MagicBytesMatch (DataBufferSP& dataSP)
+ObjectFileMachO::MagicBytesMatch (DataBufferSP& data_sp,
+ lldb::addr_t data_offset,
+ lldb::addr_t data_length)
{
- DataExtractor data(dataSP, lldb::endian::InlHostByteOrder(), 4);
+ DataExtractor data;
+ data.SetData (data_sp, data_offset, data_length);
uint32_t offset = 0;
uint32_t magic = data.GetU32(&offset);
return MachHeaderSizeFromMagic(magic) != 0;
}
-ObjectFileMachO::ObjectFileMachO(Module* module, DataBufferSP& dataSP, const FileSpec* file, addr_t offset, addr_t length) :
- ObjectFile(module, file, offset, length, dataSP),
+ObjectFileMachO::ObjectFileMachO(Module* module, DataBufferSP& data_sp, const FileSpec* file, addr_t offset, addr_t length) :
+ ObjectFile(module, file, offset, length, data_sp),
m_mutex (Mutex::eMutexTypeRecursive),
m_header(),
m_sections_ap(),
@@ -170,12 +173,7 @@ ObjectFileMachO::ParseHeader ()
ArchSpec mach_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype);
if (SetModulesArchitecture (mach_arch))
- {
- // Read in all only the load command data
- DataBufferSP data_sp(m_file.ReadFileContents(m_offset, m_header.sizeofcmds + MachHeaderSizeFromMagic(m_header.magic)));
- m_data.SetData (data_sp);
return true;
- }
}
else
{
@@ -802,37 +800,27 @@ ObjectFileMachO::ParseSymtab (bool minimize)
return 0;
const size_t addr_byte_size = m_data.GetAddressByteSize();
- const ByteOrder byte_order = m_data.GetByteOrder();
bool bit_width_32 = addr_byte_size == 4;
const size_t nlist_byte_size = bit_width_32 ? sizeof(struct nlist) : sizeof(struct nlist_64);
- DataBufferSP symtab_data_sp(m_file.ReadFileContents (m_offset + symtab_load_command.symoff,
- symtab_load_command.nsyms * nlist_byte_size));
+ DataExtractor nlist_data (m_data, symtab_load_command.symoff, symtab_load_command.nsyms * nlist_byte_size);
- if (symtab_data_sp.get() == NULL ||
- symtab_data_sp->GetBytes() == NULL ||
- symtab_data_sp->GetByteSize() == 0)
+ if (nlist_data.GetByteSize() == 0)
{
if (log)
GetModule()->LogMessage(log.get(), "failed to read nlist data");
return 0;
}
- DataBufferSP strtab_data_sp(m_file.ReadFileContents (m_offset + symtab_load_command.stroff,
- symtab_load_command.strsize));
+ DataExtractor strtab_data (m_data, symtab_load_command.stroff, symtab_load_command.strsize);
- if (strtab_data_sp.get() == NULL ||
- strtab_data_sp->GetBytes() == NULL ||
- strtab_data_sp->GetByteSize() == 0)
+ if (strtab_data.GetByteSize() == 0)
{
if (log)
GetModule()->LogMessage(log.get(), "failed to read strtab data");
return 0;
}
- const char *strtab_data = (const char *)strtab_data_sp->GetBytes();
- const size_t strtab_data_len = strtab_data_sp->GetByteSize();
-
static ConstString g_segment_name_TEXT ("__TEXT");
static ConstString g_segment_name_DATA ("__DATA");
static ConstString g_segment_name_OBJC ("__OBJC");
@@ -847,11 +835,8 @@ ObjectFileMachO::ParseSymtab (bool minimize)
eh_frame_section_sp = section_list->FindSectionByName (g_section_name_eh_frame);
uint8_t TEXT_eh_frame_sectID = eh_frame_section_sp.get() ? eh_frame_section_sp->GetID() : NListSectionNoSection;
- //uint32_t symtab_offset = 0;
- assert (symtab_data_sp->GetByteSize()/nlist_byte_size >= symtab_load_command.nsyms);
uint32_t nlist_data_offset = 0;
- DataExtractor nlist_data (symtab_data_sp, byte_order, addr_byte_size);
uint32_t N_SO_index = UINT32_MAX;
@@ -889,7 +874,8 @@ ObjectFileMachO::ParseSymtab (bool minimize)
nlist.n_value = nlist_data.GetAddress_unchecked (&nlist_data_offset);
SymbolType type = eSymbolTypeInvalid;
- if (nlist.n_strx >= strtab_data_len)
+ const char *symbol_name = strtab_data.PeekCStr(nlist.n_strx);
+ if (symbol_name == NULL)
{
// No symbol should be NULL, even the symbols with no
// string values should have an offset zero which points
@@ -902,7 +888,6 @@ ObjectFileMachO::ParseSymtab (bool minimize)
m_module->GetFileSpec().GetFilename().GetCString());
continue;
}
- const char *symbol_name = &strtab_data[nlist.n_strx];
const char *symbol_name_non_abi_mangled = NULL;
if (symbol_name[0] == '\0')
@@ -1517,12 +1502,11 @@ ObjectFileMachO::ParseSymtab (bool minimize)
// Now synthesize indirect symbols
if (m_dysymtab.nindirectsyms != 0)
{
- DataBufferSP indirect_symbol_indexes_sp(m_file.ReadFileContents(m_offset + m_dysymtab.indirectsymoff, m_dysymtab.nindirectsyms * 4));
+ DataExtractor indirect_symbol_index_data (m_data, m_dysymtab.indirectsymoff, m_dysymtab.nindirectsyms * 4);
- if (indirect_symbol_indexes_sp && indirect_symbol_indexes_sp->GetByteSize())
+ if (indirect_symbol_index_data.GetByteSize())
{
NListIndexToSymbolIndexMap::const_iterator end_index_pos = m_nlist_idx_to_sym_idx.end();
- DataExtractor indirect_symbol_index_data (indirect_symbol_indexes_sp, m_data.GetByteOrder(), m_data.GetAddressByteSize());
for (uint32_t sect_idx = 1; sect_idx < m_mach_sections.size(); ++sect_idx)
{
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
index b1077fcc272..f4f8ce9f574 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -48,7 +48,9 @@ public:
lldb::addr_t length);
static bool
- MagicBytesMatch (lldb::DataBufferSP& dataSP);
+ MagicBytesMatch (lldb::DataBufferSP& dataSP,
+ lldb::addr_t offset,
+ lldb::addr_t length);
//------------------------------------------------------------------
// Member Functions
OpenPOWER on IntegriCloud