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) | 
