mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-14 12:22:27 +00:00
Fixed a few things in the ELF object file:
1 - sections only get a valid VM size if they have SHF_ALLOC in the section flags 2 - symbol names are marked as mangled if they start with "_Z" Also fixed the DWARF parser to correctly use the section file size when extracting the DWARF. llvm-svn: 153496
This commit is contained in:
parent
c5bc412cf6
commit
47037bc4d7
@ -615,7 +615,8 @@ ObjectFileELF::GetSectionList()
|
||||
const ELFSectionHeader &header = *I;
|
||||
|
||||
ConstString name(m_shstr_data.PeekCStr(header.sh_name));
|
||||
uint64_t size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
|
||||
const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
|
||||
const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
|
||||
|
||||
static ConstString g_sect_name_text (".text");
|
||||
static ConstString g_sect_name_data (".data");
|
||||
@ -658,9 +659,9 @@ ObjectFileELF::GetSectionList()
|
||||
name, // Section name.
|
||||
sect_type, // Section type.
|
||||
header.sh_addr, // VM address.
|
||||
header.sh_size, // VM size in bytes of this section.
|
||||
vm_size, // VM size in bytes of this section.
|
||||
header.sh_offset, // Offset of this section in the file.
|
||||
size, // Size of the section as found in the file.
|
||||
file_size, // Size of the section as found in the file.
|
||||
header.sh_flags)); // Flags for this section.
|
||||
|
||||
m_sections_ap->AddSection(section);
|
||||
@ -781,11 +782,11 @@ ParseSymbols(Symtab *symtab,
|
||||
const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
|
||||
bool is_global = symbol.getBinding() == STB_GLOBAL;
|
||||
uint32_t flags = symbol.st_other << 8 | symbol.st_info;
|
||||
|
||||
bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
|
||||
Symbol dc_symbol(
|
||||
i + start_id, // ID is the original symbol table index.
|
||||
symbol_name, // Symbol name.
|
||||
false, // Is the symbol name mangled?
|
||||
is_mangled, // Is the symbol name mangled?
|
||||
symbol_type, // Type of this symbol
|
||||
is_global, // Is this globally visible?
|
||||
false, // Is this symbol debug info?
|
||||
@ -976,11 +977,12 @@ ParsePLTRelocations(Symtab *symbol_table,
|
||||
break;
|
||||
|
||||
const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
|
||||
bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
|
||||
|
||||
Symbol jump_symbol(
|
||||
i + start_id, // Symbol table index
|
||||
symbol_name, // symbol name.
|
||||
false, // is the symbol name mangled?
|
||||
is_mangled, // is the symbol name mangled?
|
||||
eSymbolTypeTrampoline, // Type of this symbol
|
||||
false, // Is this globally visible?
|
||||
false, // Is this symbol debug info?
|
||||
|
@ -439,65 +439,65 @@ SymbolFileDWARF::CalculateAbilities ()
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugInfo, true).get();
|
||||
if (section != NULL)
|
||||
{
|
||||
debug_info_file_size = section->GetByteSize();
|
||||
debug_info_file_size = section->GetFileSize();
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugAbbrev, true).get();
|
||||
if (section)
|
||||
debug_abbrev_file_size = section->GetByteSize();
|
||||
debug_abbrev_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugAbbrevData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugAranges, true).get();
|
||||
if (section)
|
||||
debug_aranges_file_size = section->GetByteSize();
|
||||
debug_aranges_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugArangesData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugFrame, true).get();
|
||||
if (section)
|
||||
debug_frame_file_size = section->GetByteSize();
|
||||
debug_frame_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugFrameData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugLine, true).get();
|
||||
if (section)
|
||||
debug_line_file_size = section->GetByteSize();
|
||||
debug_line_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugLineData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugLoc, true).get();
|
||||
if (section)
|
||||
debug_loc_file_size = section->GetByteSize();
|
||||
debug_loc_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugLocData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugMacInfo, true).get();
|
||||
if (section)
|
||||
debug_macinfo_file_size = section->GetByteSize();
|
||||
debug_macinfo_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugMacInfoData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubNames, true).get();
|
||||
if (section)
|
||||
debug_pubnames_file_size = section->GetByteSize();
|
||||
debug_pubnames_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugPubNamesData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubTypes, true).get();
|
||||
if (section)
|
||||
debug_pubtypes_file_size = section->GetByteSize();
|
||||
debug_pubtypes_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugPubTypesData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugRanges, true).get();
|
||||
if (section)
|
||||
debug_ranges_file_size = section->GetByteSize();
|
||||
debug_ranges_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugRangesData);
|
||||
|
||||
section = section_list->FindSectionByType (eSectionTypeDWARFDebugStr, true).get();
|
||||
if (section)
|
||||
debug_str_file_size = section->GetByteSize();
|
||||
debug_str_file_size = section->GetFileSize();
|
||||
else
|
||||
m_flags.Set (flagsGotDebugStrData);
|
||||
}
|
||||
@ -541,7 +541,7 @@ SymbolFileDWARF::GetCachedSectionData (uint32_t got_flag, SectionType sect_type,
|
||||
// See if we memory mapped the DWARF segment?
|
||||
if (m_dwarf_data.GetByteSize())
|
||||
{
|
||||
data.SetData(m_dwarf_data, section_sp->GetOffset (), section_sp->GetByteSize());
|
||||
data.SetData(m_dwarf_data, section_sp->GetOffset (), section_sp->GetFileSize());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -449,7 +449,7 @@ ObjectFile::MemoryMapSectionData (const Section *section, DataExtractor& section
|
||||
else
|
||||
{
|
||||
// The object file now contains a full mmap'ed copy of the object file data, so just use this
|
||||
return GetData(section->GetFileOffset(), section->GetByteSize(), section_data);
|
||||
return GetData(section->GetFileOffset(), section->GetFileSize(), section_data);
|
||||
}
|
||||
section_data.Clear();
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user