diff options
author | Greg Clayton <gclayton@apple.com> | 2013-01-25 18:06:21 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2013-01-25 18:06:21 +0000 |
commit | c7bece56faa5eef1c3d141d0c0b0b68b28a9aed2 (patch) | |
tree | 9a0132fc3b0bb4f38d06a0f352ee75ac57994771 /lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | |
parent | d0ed6c249dbd6bd488b6491b536a387548c00f7e (diff) | |
download | bcm5719-llvm-c7bece56faa5eef1c3d141d0c0b0b68b28a9aed2.tar.gz bcm5719-llvm-c7bece56faa5eef1c3d141d0c0b0b68b28a9aed2.zip |
<rdar://problem/13069948>
Major fixed to allow reading files that are over 4GB. The main problems were that the DataExtractor was using 32 bit offsets as a data cursor, and since we mmap all of our object files we could run into cases where if we had a very large core file that was over 4GB, we were running into the 4GB boundary.
So I defined a new "lldb::offset_t" which should be used for all file offsets.
After making this change, I enabled warnings for data loss and for enexpected implicit conversions temporarily and found a ton of things that I fixed.
Any functions that take an index internally, should use "size_t" for any indexes and also should return "size_t" for any sizes of collections.
llvm-svn: 173463
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index e357aff0e64..a430c264499 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -53,7 +53,7 @@ public: ~ELFRelocation(); bool - Parse(const lldb_private::DataExtractor &data, uint32_t *offset); + Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); static unsigned RelocType32(const ELFRelocation &rel); @@ -94,7 +94,7 @@ ELFRelocation::~ELFRelocation() } bool -ELFRelocation::Parse(const lldb_private::DataExtractor &data, uint32_t *offset) +ELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset) { if (reloc.is<ELFRel*>()) return reloc.get<ELFRel*>()->Parse(data, offset); @@ -270,28 +270,28 @@ ObjectFileELF::GetByteOrder() const return eByteOrderInvalid; } -size_t +uint32_t ObjectFileELF::GetAddressByteSize() const { return m_data.GetAddressByteSize(); } -unsigned +size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) { - return std::distance(m_section_headers.begin(), I) + 1; + return std::distance(m_section_headers.begin(), I) + 1u; } -unsigned +size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const { - return std::distance(m_section_headers.begin(), I) + 1; + return std::distance(m_section_headers.begin(), I) + 1u; } bool ObjectFileELF::ParseHeader() { - uint32_t offset = GetOffset(); + lldb::offset_t offset = GetOffset(); return m_header.Parse(m_data, &offset); } @@ -445,8 +445,8 @@ ObjectFileELF::ParseDependentModules() ReadSectionData(dynstr, dynstr_data)) { ELFDynamic symbol; - const unsigned section_size = dynsym_data.GetByteSize(); - unsigned offset = 0; + const lldb::offset_t section_size = dynsym_data.GetByteSize(); + lldb::offset_t offset = 0; // The only type of entries we are concerned with are tagged DT_NEEDED, // yielding the name of a required library. @@ -492,7 +492,7 @@ ObjectFileELF::ParseProgramHeaders() return 0; uint32_t idx; - uint32_t offset; + lldb::offset_t offset; for (idx = 0, offset = 0; idx < m_header.e_phnum; ++idx) { if (m_program_headers[idx].Parse(data, &offset) == false) @@ -530,7 +530,7 @@ ObjectFileELF::ParseSectionHeaders() return 0; uint32_t idx; - uint32_t offset; + lldb::offset_t offset; for (idx = 0, offset = 0; idx < m_header.e_shnum; ++idx) { if (m_section_headers[idx].Parse(data, &offset) == false) @@ -698,9 +698,8 @@ ParseSymbols(Symtab *symtab, const DataExtractor &strtab_data) { ELFSymbol symbol; - uint32_t offset = 0; - const unsigned num_symbols = - symtab_data.GetByteSize() / symtab_shdr->sh_entsize; + lldb::offset_t offset = 0; + const size_t num_symbols = symtab_data.GetByteSize() / symtab_shdr->sh_entsize; static ConstString text_section_name(".text"); static ConstString init_section_name(".init"); @@ -877,8 +876,8 @@ ObjectFileELF::ParseDynamicSymbols() DataExtractor dynsym_data; if (ReadSectionData(dynsym, dynsym_data)) { - const unsigned section_size = dynsym_data.GetByteSize(); - unsigned cursor = 0; + const lldb::offset_t section_size = dynsym_data.GetByteSize(); + lldb::offset_t cursor = 0; while (cursor < section_size) { @@ -956,9 +955,9 @@ ParsePLTRelocations(Symtab *symbol_table, { ELFRelocation rel(rel_type); ELFSymbol symbol; - uint32_t offset = 0; - const unsigned plt_entsize = plt_hdr->sh_entsize; - const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; + lldb::offset_t offset = 0; + const elf_xword plt_entsize = plt_hdr->sh_entsize; + const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); reloc_info_fn reloc_type; @@ -985,7 +984,7 @@ ParsePLTRelocations(Symtab *symbol_table, if (reloc_type(rel) != slot_type) continue; - unsigned symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize; + lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize; uint64_t plt_index = (i + 1) * plt_entsize; if (!symbol.Parse(symtab_data, &symbol_offset)) @@ -1378,7 +1377,7 @@ ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) // Dump an token value for the ELF section header member sh_flags //---------------------------------------------------------------------- void -ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_word sh_flags) +ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags) { *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ") << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ') |