diff options
-rw-r--r-- | lldb/include/lldb/Core/Module.h | 2 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/ObjectFile.h | 2 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 12 | ||||
-rw-r--r-- | lldb/source/Core/Module.cpp | 4 | ||||
-rw-r--r-- | lldb/source/Symbol/ObjectFile.cpp | 11 |
5 files changed, 23 insertions, 8 deletions
diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h index aa56e84891b..c8305773bf4 100644 --- a/lldb/include/lldb/Core/Module.h +++ b/lldb/include/lldb/Core/Module.h @@ -974,7 +974,7 @@ public: /// /// @return //------------------------------------------------------------------ - Error LoadInMemory(Target &target); + Error LoadInMemory(Target &target, bool set_pc); //---------------------------------------------------------------------- /// @class LookupInfo Module.h "lldb/Core/Module.h" diff --git a/lldb/include/lldb/Symbol/ObjectFile.h b/lldb/include/lldb/Symbol/ObjectFile.h index 346e465371b..47614d2688a 100644 --- a/lldb/include/lldb/Symbol/ObjectFile.h +++ b/lldb/include/lldb/Symbol/ObjectFile.h @@ -786,7 +786,7 @@ public: /// /// @return //------------------------------------------------------------------ - virtual Error LoadInMemory(Target &target); + virtual Error LoadInMemory(Target &target, bool set_pc); protected: //------------------------------------------------------------------ diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 61e9e9bcd94..37dec184805 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -2568,8 +2568,11 @@ public: m_file_option(LLDB_OPT_SET_1, false, "file", 'f', 0, eArgTypeName, "Fullpath or basename for module to load.", ""), m_load_option(LLDB_OPT_SET_1, false, "load", 'l', - "Write file contents to the memory.", - false, true), + "Write file contents to the memory.", false, true), + m_pc_option(LLDB_OPT_SET_1, false, "--set-pc-to-entry", 'p', + "Set PC to the entry point." + " Only applicable with '--load' option.", + false, true), m_slide_option(LLDB_OPT_SET_1, false, "slide", 's', 0, eArgTypeOffset, "Set the load address for all sections to be the " "virtual address in the file plus the offset.", @@ -2578,6 +2581,7 @@ public: LLDB_OPT_SET_1); m_option_group.Append(&m_file_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); m_option_group.Append(&m_load_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); + m_option_group.Append(&m_pc_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); m_option_group.Append(&m_slide_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); m_option_group.Finalize(); } @@ -2590,6 +2594,7 @@ protected: bool DoExecute(Args &args, CommandReturnObject &result) override { Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); const bool load = m_load_option.GetOptionValue().GetCurrentValue(); + const bool set_pc = m_pc_option.GetOptionValue().GetCurrentValue(); if (target == nullptr) { result.AppendError("invalid target, create a debug target using the " "'target create' command"); @@ -2742,7 +2747,7 @@ protected: process->Flush(); } if (load) { - Error error = module->LoadInMemory(*target); + Error error = module->LoadInMemory(*target, set_pc); if (error.Fail()) { result.AppendError(error.AsCString()); return false; @@ -2811,6 +2816,7 @@ protected: OptionGroupUUID m_uuid_option_group; OptionGroupString m_file_option; OptionGroupBoolean m_load_option; + OptionGroupBoolean m_pc_option; OptionGroupUInt64 m_slide_option; }; diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index 8cd06f11507..d36f7cea359 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -1665,6 +1665,6 @@ bool Module::GetIsDynamicLinkEditor() { return false; } -Error Module::LoadInMemory(Target &target) { - return m_objfile_sp->LoadInMemory(target); +Error Module::LoadInMemory(Target &target, bool set_pc) { + return m_objfile_sp->LoadInMemory(target, set_pc); } diff --git a/lldb/source/Symbol/ObjectFile.cpp b/lldb/source/Symbol/ObjectFile.cpp index ecae78e3954..c5f0b477a91 100644 --- a/lldb/source/Symbol/ObjectFile.cpp +++ b/lldb/source/Symbol/ObjectFile.cpp @@ -652,11 +652,13 @@ ConstString ObjectFile::GetNextSyntheticSymbolName() { return ConstString(ss.GetString()); } -Error ObjectFile::LoadInMemory(Target &target) { +Error ObjectFile::LoadInMemory(Target &target, bool set_pc) { Error error; ProcessSP process = target.CalculateProcess(); if (!process) return Error("No Process"); + if (set_pc && !GetEntryPointAddress().IsValid()) + return Error("No entry address in object file"); SectionList *section_list = GetSectionList(); if (!section_list) @@ -677,5 +679,12 @@ Error ObjectFile::LoadInMemory(Target &target) { return error; } } + if (set_pc) { + ThreadList &thread_list = process->GetThreadList(); + ThreadSP curr_thread(thread_list.GetSelectedThread()); + RegisterContextSP reg_context(curr_thread->GetRegisterContext()); + Address file_entry = GetEntryPointAddress(); + reg_context->SetPC(file_entry.GetLoadAddress(&target)); + } return error; } |