Index: include/lldb/Core/Module.h =================================================================== --- include/lldb/Core/Module.h +++ include/lldb/Core/Module.h @@ -974,7 +974,7 @@ /// /// @return //------------------------------------------------------------------ - Error LoadInMemory(Target &target); + Error LoadInMemory(Target &target, bool set_pc); //---------------------------------------------------------------------- /// @class LookupInfo Module.h "lldb/Core/Module.h" Index: include/lldb/Symbol/ObjectFile.h =================================================================== --- include/lldb/Symbol/ObjectFile.h +++ include/lldb/Symbol/ObjectFile.h @@ -786,7 +786,7 @@ /// /// @return //------------------------------------------------------------------ - virtual Error LoadInMemory(Target &target); + virtual Error LoadInMemory(Target &target, bool set_pc); protected: //------------------------------------------------------------------ Index: source/Commands/CommandObjectTarget.cpp =================================================================== --- source/Commands/CommandObjectTarget.cpp +++ source/Commands/CommandObjectTarget.cpp @@ -2568,8 +2568,11 @@ 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 @@ 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 @@ 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 @@ 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 @@ OptionGroupUUID m_uuid_option_group; OptionGroupString m_file_option; OptionGroupBoolean m_load_option; + OptionGroupBoolean m_pc_option; OptionGroupUInt64 m_slide_option; }; Index: source/Core/Module.cpp =================================================================== --- source/Core/Module.cpp +++ source/Core/Module.cpp @@ -1665,6 +1665,6 @@ 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); } Index: source/Symbol/ObjectFile.cpp =================================================================== --- source/Symbol/ObjectFile.cpp +++ source/Symbol/ObjectFile.cpp @@ -652,11 +652,13 @@ 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 @@ 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; }