1 //===-- ObjectFilePlaceholder.cpp----------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "ObjectFilePlaceholder.h" 10 11 #include "lldb/Core/Module.h" 12 #include "lldb/Core/ModuleSpec.h" 13 #include "lldb/Core/PluginManager.h" 14 #include "lldb/Core/Section.h" 15 #include "lldb/Target/SectionLoadList.h" 16 #include "lldb/Target/Target.h" 17 18 #include <memory> 19 20 using namespace lldb; 21 using namespace lldb_private; 22 23 LLDB_PLUGIN_DEFINE(ObjectFilePlaceholder) 24 25 ObjectFilePlaceholder::ObjectFilePlaceholder( 26 const lldb::ModuleSP &module_sp, 27 const lldb_private::ModuleSpec &module_spec, lldb::addr_t base, 28 lldb::addr_t size) 29 : ObjectFile(module_sp, &module_spec.GetFileSpec(), /*file_offset*/ 0, 30 /*length*/ 0, /*data_sp*/ nullptr, /*data_offset*/ 0), 31 m_arch(module_spec.GetArchitecture()), m_uuid(module_spec.GetUUID()), 32 m_base(base), m_size(size) { 33 m_symtab_up = std::make_unique<lldb_private::Symtab>(this); 34 } 35 36 void ObjectFilePlaceholder::CreateSections( 37 lldb_private::SectionList &unified_section_list) { 38 m_sections_up = std::make_unique<lldb_private::SectionList>(); 39 auto section_sp = std::make_shared<lldb_private::Section>( 40 GetModule(), this, /*sect_id*/ 0, 41 lldb_private::ConstString(".module_image"), eSectionTypeOther, m_base, 42 m_size, /*file_offset*/ 0, /*file_size*/ 0, 43 /*log2align*/ 0, /*flags*/ 0); 44 section_sp->SetPermissions(ePermissionsReadable | ePermissionsExecutable); 45 m_sections_up->AddSection(section_sp); 46 unified_section_list.AddSection(std::move(section_sp)); 47 } 48 49 lldb_private::Address ObjectFilePlaceholder::GetBaseAddress() { 50 return lldb_private::Address(m_sections_up->GetSectionAtIndex(0), 0); 51 } 52 53 bool ObjectFilePlaceholder::SetLoadAddress(Target &target, addr_t value, 54 bool value_is_offset) { 55 assert(!value_is_offset); 56 assert(value == m_base); 57 58 // Create sections if they haven't been created already. 59 GetModule()->GetSectionList(); 60 assert(m_sections_up->GetNumSections(0) == 1); 61 62 target.GetSectionLoadList().SetSectionLoadAddress( 63 m_sections_up->GetSectionAtIndex(0), m_base); 64 return true; 65 } 66 67 void ObjectFilePlaceholder::Dump(lldb_private::Stream *s) { 68 s->Format("Placeholder object file for {0} loaded at [{1:x}-{2:x})\n", 69 GetFileSpec(), m_base, m_base + m_size); 70 } 71