diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:09:23 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:09:23 +0000 |
commit | f73363f1dd94996356cefbf24388f561891acf0b (patch) | |
tree | e3c31248bdb36eaec5fd833490d4278162dba2a0 /source/Symbol/ObjectFile.cpp | |
parent | 160ee69dd7ae18978f4068116777639ea98dc951 (diff) |
Notes
Diffstat (limited to 'source/Symbol/ObjectFile.cpp')
-rw-r--r-- | source/Symbol/ObjectFile.cpp | 195 |
1 files changed, 91 insertions, 104 deletions
diff --git a/source/Symbol/ObjectFile.cpp b/source/Symbol/ObjectFile.cpp index 2129a4463cdd..59012b1f8261 100644 --- a/source/Symbol/ObjectFile.cpp +++ b/source/Symbol/ObjectFile.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// #include "lldb/Symbol/ObjectFile.h" -#include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" @@ -16,7 +15,6 @@ #include "lldb/Symbol/ObjectContainer.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Target/Process.h" -#include "lldb/Target/RegisterContext.h" #include "lldb/Target/SectionLoadList.h" #include "lldb/Target/Target.h" #include "lldb/Utility/DataBuffer.h" @@ -51,10 +49,9 @@ ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file, const bool file_exists = file->Exists(); if (!data_sp) { - // We have an object name which most likely means we have - // a .o file in a static archive (.a file). Try and see if - // we have a cached archive first without reading any data - // first + // We have an object name which most likely means we have a .o file in + // a static archive (.a file). Try and see if we have a cached archive + // first without reading any data first if (file_exists && module_sp->GetObjectName()) { for (uint32_t idx = 0; (create_object_container_callback = @@ -73,10 +70,10 @@ ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file, return object_file_sp; } } - // Ok, we didn't find any containers that have a named object, now - // lets read the first 512 bytes from the file so the object file - // and object container plug-ins can use these bytes to see if they - // can parse this file. + // Ok, we didn't find any containers that have a named object, now lets + // read the first 512 bytes from the file so the object file and object + // container plug-ins can use these bytes to see if they can parse this + // file. if (file_size > 0) { data_sp = DataBufferLLVM::CreateSliceFromPath(file->GetPath(), 512, file_offset); @@ -99,11 +96,12 @@ ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file, file = &archive_file; module_sp->SetFileSpecAndObjectName(archive_file, archive_object); // Check if this is a object container by iterating through all - // object - // container plugin instances and then trying to get an object file - // from the container plugins since we had a name. Also, don't read + // object container plugin instances and then trying to get an + // object file from the container plugins since we had a name. + // Also, don't read // ANY data in case there is data cached in the container plug-ins - // (like BSD archives caching the contained objects within an file). + // (like BSD archives caching the contained objects within an + // file). for (uint32_t idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex( @@ -120,8 +118,8 @@ ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file, if (object_file_sp.get()) return object_file_sp; } - // We failed to find any cached object files in the container - // plug-ins, so lets read the first 512 bytes and try again below... + // We failed to find any cached object files in the container plug- + // ins, so lets read the first 512 bytes and try again below... data_sp = DataBufferLLVM::CreateSliceFromPath(archive_file.GetPath(), 512, file_offset); } @@ -129,8 +127,8 @@ ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file, } if (data_sp && data_sp->GetByteSize() > 0) { - // Check if this is a normal object file by iterating through - // all object file plugin instances. + // Check if this is a normal object file by iterating through all + // object file plugin instances. ObjectFileCreateInstance create_object_file_callback; for (uint32_t idx = 0; (create_object_file_callback = @@ -143,9 +141,9 @@ ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file, return object_file_sp; } - // Check if this is a object container by iterating through - // all object container plugin instances and then trying to get - // an object file from the container. + // Check if this is a object container by iterating through all object + // container plugin instances and then trying to get an object file + // from the container. for (uint32_t idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex( @@ -164,8 +162,8 @@ ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file, } } } - // We didn't find it, so clear our shared pointer in case it - // contains anything and return an empty shared pointer + // We didn't find it, so clear our shared pointer in case it contains + // anything and return an empty shared pointer object_file_sp.reset(); return object_file_sp; } @@ -186,8 +184,8 @@ ObjectFileSP ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, static_cast<void *>(process_sp.get()), header_addr); uint32_t idx; - // Check if this is a normal object file by iterating through - // all object file plugin instances. + // Check if this is a normal object file by iterating through all object + // file plugin instances. ObjectFileCreateMemoryInstance create_callback; for (idx = 0; (create_callback = @@ -201,8 +199,8 @@ ObjectFileSP ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, } } - // We didn't find it, so clear our shared pointer in case it - // contains anything and return an empty shared pointer + // We didn't find it, so clear our shared pointer in case it contains + // anything and return an empty shared pointer object_file_sp.reset(); return object_file_sp; } @@ -326,11 +324,11 @@ AddressClass ObjectFile::GetAddressClass(addr_t file_addr) { const SectionType section_type = section_sp->GetType(); switch (section_type) { case eSectionTypeInvalid: - return eAddressClassUnknown; + return AddressClass::eUnknown; case eSectionTypeCode: - return eAddressClassCode; + return AddressClass::eCode; case eSectionTypeContainer: - return eAddressClassUnknown; + return AddressClass::eUnknown; case eSectionTypeData: case eSectionTypeDataCString: case eSectionTypeDataCStringPointers: @@ -343,7 +341,7 @@ AddressClass ObjectFile::GetAddressClass(addr_t file_addr) { case eSectionTypeDataObjCMessageRefs: case eSectionTypeDataObjCCFStrings: case eSectionTypeGoSymtab: - return eAddressClassData; + return AddressClass::eData; case eSectionTypeDebug: case eSectionTypeDWARFDebugAbbrev: case eSectionTypeDWARFDebugAddr: @@ -355,33 +353,34 @@ AddressClass ObjectFile::GetAddressClass(addr_t file_addr) { case eSectionTypeDWARFDebugLoc: case eSectionTypeDWARFDebugMacInfo: case eSectionTypeDWARFDebugMacro: + case eSectionTypeDWARFDebugNames: case eSectionTypeDWARFDebugPubNames: case eSectionTypeDWARFDebugPubTypes: case eSectionTypeDWARFDebugRanges: case eSectionTypeDWARFDebugStr: case eSectionTypeDWARFDebugStrOffsets: + case eSectionTypeDWARFDebugTypes: case eSectionTypeDWARFAppleNames: case eSectionTypeDWARFAppleTypes: case eSectionTypeDWARFAppleNamespaces: case eSectionTypeDWARFAppleObjC: - return eAddressClassDebug; + case eSectionTypeDWARFGNUDebugAltLink: + return AddressClass::eDebug; case eSectionTypeEHFrame: case eSectionTypeARMexidx: case eSectionTypeARMextab: case eSectionTypeCompactUnwind: - return eAddressClassRuntime; + return AddressClass::eRuntime; case eSectionTypeELFSymbolTable: case eSectionTypeELFDynamicSymbols: case eSectionTypeELFRelocationEntries: case eSectionTypeELFDynamicLinkInfo: case eSectionTypeOther: - return eAddressClassUnknown; + return AddressClass::eUnknown; case eSectionTypeAbsoluteAddress: // In case of absolute sections decide the address class based on - // the symbol - // type because the section type isn't specify if it is a code or a - // data - // section. + // the symbol type because the section type isn't specify if it is + // a code or a data section. break; } } @@ -390,67 +389,67 @@ AddressClass ObjectFile::GetAddressClass(addr_t file_addr) { const SymbolType symbol_type = symbol->GetType(); switch (symbol_type) { case eSymbolTypeAny: - return eAddressClassUnknown; + return AddressClass::eUnknown; case eSymbolTypeAbsolute: - return eAddressClassUnknown; + return AddressClass::eUnknown; case eSymbolTypeCode: - return eAddressClassCode; + return AddressClass::eCode; case eSymbolTypeTrampoline: - return eAddressClassCode; + return AddressClass::eCode; case eSymbolTypeResolver: - return eAddressClassCode; + return AddressClass::eCode; case eSymbolTypeData: - return eAddressClassData; + return AddressClass::eData; case eSymbolTypeRuntime: - return eAddressClassRuntime; + return AddressClass::eRuntime; case eSymbolTypeException: - return eAddressClassRuntime; + return AddressClass::eRuntime; case eSymbolTypeSourceFile: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeHeaderFile: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeObjectFile: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeCommonBlock: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeBlock: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeLocal: - return eAddressClassData; + return AddressClass::eData; case eSymbolTypeParam: - return eAddressClassData; + return AddressClass::eData; case eSymbolTypeVariable: - return eAddressClassData; + return AddressClass::eData; case eSymbolTypeVariableType: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeLineEntry: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeLineHeader: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeScopeBegin: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeScopeEnd: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeAdditional: - return eAddressClassUnknown; + return AddressClass::eUnknown; case eSymbolTypeCompiler: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeInstrumentation: - return eAddressClassDebug; + return AddressClass::eDebug; case eSymbolTypeUndefined: - return eAddressClassUnknown; + return AddressClass::eUnknown; case eSymbolTypeObjCClass: - return eAddressClassRuntime; + return AddressClass::eRuntime; case eSymbolTypeObjCMetaClass: - return eAddressClassRuntime; + return AddressClass::eRuntime; case eSymbolTypeObjCIVar: - return eAddressClassRuntime; + return AddressClass::eRuntime; case eSymbolTypeReExported: - return eAddressClassRuntime; + return AddressClass::eRuntime; } } } - return eAddressClassUnknown; + return AddressClass::eUnknown; } DataBufferSP ObjectFile::ReadMemory(const ProcessSP &process_sp, @@ -470,16 +469,14 @@ DataBufferSP ObjectFile::ReadMemory(const ProcessSP &process_sp, size_t ObjectFile::GetData(lldb::offset_t offset, size_t length, DataExtractor &data) const { // The entire file has already been mmap'ed into m_data, so just copy from - // there - // as the back mmap buffer will be shared with shared pointers. + // there as the back mmap buffer will be shared with shared pointers. return data.SetData(m_data, offset, length); } size_t ObjectFile::CopyData(lldb::offset_t offset, size_t length, void *dst) const { // The entire file has already been mmap'ed into m_data, so just copy from - // there - // Note that the data remains in target byte order. + // there Note that the data remains in target byte order. return m_data.CopyData(offset, length, dst); } @@ -559,8 +556,8 @@ size_t ObjectFile::ReadSectionData(Section *section, return GetData(section->GetFileOffset(), section->GetFileSize(), section_data); } else { - // The object file now contains a full mmap'ed copy of the object file data, - // so just use this + // The object file now contains a full mmap'ed copy of the object file + // data, so just use this if (!section->IsRelocated()) RelocateSection(section); @@ -581,7 +578,7 @@ bool ObjectFile::SplitArchivePathWithObject(const char *path_with_object, std::string obj; if (regex_match.GetMatchAtIndex(path_with_object, 1, path) && regex_match.GetMatchAtIndex(path_with_object, 2, obj)) { - archive_file.SetFile(path, false); + archive_file.SetFile(path, false, FileSpec::Style::native); archive_object.SetCString(obj.c_str()); if (must_exist && !archive_file.Exists()) return false; @@ -648,41 +645,31 @@ ConstString ObjectFile::GetNextSyntheticSymbolName() { return ConstString(ss.GetString()); } -Status ObjectFile::LoadInMemory(Target &target, bool set_pc) { - Status error; - ProcessSP process = target.CalculateProcess(); - if (!process) - return Status("No Process"); - if (set_pc && !GetEntryPointAddress().IsValid()) - return Status("No entry address in object file"); - +std::vector<ObjectFile::LoadableData> +ObjectFile::GetLoadableData(Target &target) { + std::vector<LoadableData> loadables; SectionList *section_list = GetSectionList(); if (!section_list) - return Status("No section in object file"); + return loadables; + // Create a list of loadable data from loadable sections size_t section_count = section_list->GetNumSections(0); for (size_t i = 0; i < section_count; ++i) { + LoadableData loadable; SectionSP section_sp = section_list->GetSectionAtIndex(i); - addr_t addr = target.GetSectionLoadList().GetSectionLoadAddress(section_sp); - if (addr != LLDB_INVALID_ADDRESS) { - DataExtractor section_data; - // We can skip sections like bss - if (section_sp->GetFileSize() == 0) - continue; - section_sp->GetSectionData(section_data); - lldb::offset_t written = process->WriteMemory( - addr, section_data.GetDataStart(), section_data.GetByteSize(), error); - if (written != section_data.GetByteSize()) - 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)); + loadable.Dest = + target.GetSectionLoadList().GetSectionLoadAddress(section_sp); + if (loadable.Dest == LLDB_INVALID_ADDRESS) + continue; + // We can skip sections like bss + if (section_sp->GetFileSize() == 0) + continue; + DataExtractor section_data; + section_sp->GetSectionData(section_data); + loadable.Contents = llvm::ArrayRef<uint8_t>(section_data.GetDataStart(), + section_data.GetByteSize()); + loadables.push_back(loadable); } - return error; + return loadables; } void ObjectFile::RelocateSection(lldb_private::Section *section) |