summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
diff options
context:
space:
mode:
authorStephen Wilson <wilsons@start.ca>2011-03-08 04:12:15 +0000
committerStephen Wilson <wilsons@start.ca>2011-03-08 04:12:15 +0000
commitd126c8cc5a58988928808a0dbc4ea908463ec5a2 (patch)
treebcfd1f08ec8ab906476d70c3ab3a2ebe3b183a2b /lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
parent97c250405b2a7e52f546e27644c494ee181bd6f7 (diff)
downloadbcm5719-llvm-d126c8cc5a58988928808a0dbc4ea908463ec5a2.tar.gz
bcm5719-llvm-d126c8cc5a58988928808a0dbc4ea908463ec5a2.zip
Fix ObjectFileElf::GetEntryPointAddress()
ELF object files do not implicitly have a symbol named "start" as an entry point. For example, on Linux it is often named "_start", but can be trivially set to any symbol by passing an --entry argument to the linker. Use the ELF header to determine the entry point and resolve the associated section based on that address. Also, update the linux dynamic loader to call GetEntryPointAddress instead of GetEntryPoint. llvm-svn: 127218
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp')
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp36
1 files changed, 18 insertions, 18 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 03541b4faf4..2d5471d3a7f 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -272,27 +272,27 @@ ObjectFileELF::GetImageInfoAddress()
lldb_private::Address
ObjectFileELF::GetEntryPointAddress ()
{
- // If the object file is not an executable it can't hold the entry point. m_entry_point_address
- // is initialized to an invalid address, so we can just return that.
- // If m_entry_point_address is valid it means we've found it already, so return the cached value.
-
- if (!IsExecutable() || m_entry_point_address.IsValid())
+ SectionList *sections;
+ addr_t offset;
+
+ if (m_entry_point_address.IsValid())
return m_entry_point_address;
-
- // FIXME: This is just looking for the "start" symbol, but that will fail if "start" is stripped.
- // There's probably a better way in ELF to find the start address of an executable module.
-
- SymbolContextList contexts;
- SymbolContext context;
- if (!m_module->FindSymbolsWithNameAndType(ConstString ("start"), lldb::eSymbolTypeCode, contexts))
+
+ if (!ParseHeader() || !IsExecutable())
return m_entry_point_address;
-
- contexts.GetContextAtIndex(0, context);
-
- m_entry_point_address = context.symbol->GetValue();
-
- return m_entry_point_address;
+ sections = GetSectionList();
+ offset = m_header.e_entry;
+
+ if (!sections)
+ {
+ m_entry_point_address.SetOffset(offset);
+ return m_entry_point_address;
+ }
+
+ m_entry_point_address.ResolveAddressUsingFileSections(offset, sections);
+
+ return m_entry_point_address;
}
//----------------------------------------------------------------------
OpenPOWER on IntegriCloud