summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins')
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index e507f0e4d74..76abe32ff51 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2703,6 +2703,46 @@ Symtab *ObjectFileELF::GetSymtab() {
if (m_symtab_up == nullptr)
m_symtab_up.reset(new Symtab(this));
+ // In the event that there's no symbol entry for the entry point we'll
+ // artifically create one. We delegate to the symtab object the figuring
+ // out of the proper size, this will usually make it span til the next
+ // symbol it finds in the section. This means that if there are missing
+ // symbols the entry point might span beyond its function definition.
+ // We're fine with this as it doesn't make it worse than not having a
+ // symbol entry at all.
+ ArchSpec arch = GetArchitecture();
+ auto entry_point_addr = GetEntryPointAddress().GetFileAddress();
+ if (entry_point_addr != LLDB_INVALID_ADDRESS) {
+ if (!m_symtab_up->FindSymbolContainingFileAddress(entry_point_addr)) {
+ uint64_t symbol_id = m_symtab_up->GetNumSymbols();
+ SectionSP section_sp =
+ GetSectionList()->FindSectionContainingFileAddress(entry_point_addr);
+ Symbol symbol(
+ symbol_id,
+ GetNextSyntheticSymbolName().GetCString(), // Symbol name.
+ false, // Is the symbol name mangled?
+ eSymbolTypeCode, // Type of this symbol.
+ true, // Is this globally visible?
+ false, // Is this symbol debug info?
+ false, // Is this symbol a trampoline?
+ true, // Is this symbol artificial?
+ section_sp, // Section in which this symbol is defined or null.
+ 0, // Offset in section or symbol value.
+ 0, // Size.
+ false, // Size is valid.
+ false, // Contains linker annotations?
+ 0); // Symbol flags.
+ m_symtab_up->AddSymbol(symbol);
+ // When the entry point is arm thumb we need to explicitly set its
+ // class address to reflect that. This is important because expression
+ // evaluation relies on correctly setting a breakpoint at this address.
+ if (arch.GetMachine() == llvm::Triple::arm && (entry_point_addr & 1))
+ m_address_class_map[entry_point_addr ^ 1] = AddressClass::eCodeAlternateISA;
+ else
+ m_address_class_map[entry_point_addr] = AddressClass::eCode;
+ }
+ }
+
m_symtab_up->CalculateSymbolSizes();
}
OpenPOWER on IntegriCloud