33#include "llvm/BinaryFormat/COFF.h"
34#include "llvm/Object/COFFImportFile.h"
35#include "llvm/Support/CRC.h"
36#include "llvm/Support/Error.h"
37#include "llvm/Support/FormatAdapters.h"
38#include "llvm/Support/MemoryBuffer.h"
39#include "llvm/TargetParser/Host.h"
42#define IMAGE_DOS_SIGNATURE 0x5A4D
43#define IMAGE_NT_SIGNATURE 0x00004550
44#define OPT_HEADER_MAGIC_PE32 0x010b
45#define OPT_HEADER_MAGIC_PE32_PLUS 0x020b
56 llvm::Triple::UnknownEnvironment,
58 "Use default target (if it is Windows) or MSVC",
68 "MinGW / Itanium ABI",
72#define LLDB_PROPERTIES_objectfilepecoff
73#include "ObjectFilePECOFFProperties.inc"
76#define LLDB_PROPERTIES_objectfilepecoff
77#include "ObjectFilePECOFFPropertiesEnum.inc"
82 static llvm::StringRef GetSettingName() {
87 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
88 m_collection_sp->Initialize(g_objectfilepecoff_properties);
91 llvm::Triple::EnvironmentType
ABI()
const {
92 return GetPropertyAtIndexAs<llvm::Triple::EnvironmentType>(
93 ePropertyABI, llvm::Triple::UnknownEnvironment);
97 return m_collection_sp->GetPropertyAtIndexAsOptionValueDictionary(
98 ePropertyModuleABIMap);
105 static PluginProperties g_settings;
110 std::string &gnu_debuglink_file,
111 uint32_t &gnu_debuglink_crc) {
112 static ConstString g_sect_name_gnu_debuglink(
".gnu_debuglink");
113 for (
const auto §ion : coff_obj.sections()) {
114 auto name = section.getName();
116 llvm::consumeError(name.takeError());
119 if (*name == g_sect_name_gnu_debuglink.
GetStringRef()) {
120 auto content = section.getContents();
122 llvm::consumeError(content.takeError());
126 content->data(), content->size(),
129 gnu_debuglink_file = data.
GetCStr(&gnu_debuglink_offset);
131 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4);
132 data.
GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
140 const llvm::codeview::DebugInfo *pdb_info =
nullptr;
141 llvm::StringRef pdb_file;
145 if (!coff_obj.getDebugPDBInfo(pdb_info, pdb_file) && pdb_info) {
146 if (pdb_info->PDB70.CVSignature == llvm::OMF::Signature::PDB70) {
148 memcpy(&info.
Uuid, pdb_info->PDB70.Signature,
sizeof(info.
Uuid));
149 info.
Age = pdb_info->PDB70.Age;
154 std::string gnu_debuglink_file;
155 uint32_t gnu_debuglink_crc;
164 auto raw_data = coff_obj.getData();
166 "Calculating module crc32 %s with size %" PRIu64
" KiB",
169 gnu_debuglink_crc = llvm::crc32(0, llvm::arrayRefFromStringRef(raw_data));
172 llvm::support::ulittle32_t data(gnu_debuglink_crc);
173 return UUID(&data,
sizeof(data));
187 debugger, PluginProperties::GetSettingName())) {
188 const bool is_global_setting =
true;
191 "Properties for the PE/COFF object-file plug-in.", is_global_setting);
200 return "Portable Executable and Common Object File Format object file reader "
220 if (data_sp->GetByteSize() < length) {
226 auto objfile_up = std::make_unique<ObjectFilePECOFF>(
227 module_sp, data_sp, data_offset, file_p, file_offset, length);
228 if (!objfile_up || !objfile_up->ParseHeader())
232 if (!objfile_up->CreateBinary())
234 return objfile_up.release();
242 auto objfile_up = std::make_unique<ObjectFilePECOFF>(
243 module_sp, data_sp, process_sp, header_addr);
244 if (objfile_up.get() && objfile_up->ParseHeader()) {
245 return objfile_up.release();
254 const size_t initial_count = specs.
GetSize();
256 return initial_count;
260 if (data_sp->GetByteSize() < length)
262 data_sp = std::move(full_sp);
263 auto binary = llvm::object::createBinary(llvm::MemoryBufferRef(
268 "Failed to create binary for file ({1}): {0}", file);
269 return initial_count;
272 auto *COFFObj = llvm::dyn_cast<llvm::object::COFFObjectFile>(binary->get());
274 return initial_count;
282 static llvm::Triple::EnvironmentType default_env = [] {
283 auto def_target = llvm::Triple(
284 llvm::Triple::normalize(llvm::sys::getDefaultTargetTriple()));
285 if (def_target.getOS() == llvm::Triple::Win32 &&
286 def_target.getEnvironment() != llvm::Triple::UnknownEnvironment)
287 return def_target.getEnvironment();
288 return llvm::Triple::MSVC;
294 if (map->GetNumValues() > 0) {
297 module_env_option = map->GetValueForKey(name);
298 if (!module_env_option) {
301 module_env_option = map->GetValueForKey(llvm::StringRef(name_lower));
303 if (!module_env_option) {
305 auto name_stripped = name.GetStringRef();
306 if (name_stripped.consume_back_insensitive(
".debug")) {
307 module_env_option = map->GetValueForKey(name_stripped);
308 if (!module_env_option) {
311 auto name_lower = name_stripped.lower();
312 module_env_option = map->GetValueForKey(llvm::StringRef(name_lower));
317 llvm::Triple::EnvironmentType env;
318 if (module_env_option)
320 module_env_option->GetValueAs<llvm::Triple::EnvironmentType>().value_or(
321 static_cast<llvm::Triple::EnvironmentType
>(0));
325 if (env == llvm::Triple::UnknownEnvironment)
328 switch (COFFObj->getMachine()) {
332 specs.
Append(module_spec);
337 specs.
Append(module_spec);
342 specs.
Append(module_spec);
348 specs.
Append(module_spec);
354 return specs.
GetSize() - initial_count;
368 uint16_t magic = data.
GetU16(&offset);
375 const auto complex_type =
376 coff_symbol_type >> llvm::COFF::SCT_COMPLEX_TYPE_SHIFT;
377 if (complex_type == llvm::COFF::IMAGE_SYM_DTYPE_FUNCTION) {
380 const auto base_type = coff_symbol_type & 0xff;
381 if (base_type == llvm::COFF::IMAGE_SYM_TYPE_NULL &&
382 complex_type == llvm::COFF::IMAGE_SYM_DTYPE_NULL) {
396 auto binary = llvm::object::createBinary(llvm::MemoryBufferRef(
400 "Failed to create binary for file ({1}): {0}",
m_file);
406 llvm::unique_dyn_cast<llvm::object::COFFObjectFile>(std::move(*binary));
410 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
422 :
ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
423 m_dos_header(), m_coff_header(), m_coff_header_opt(), m_sect_headers(),
431 :
ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
432 m_dos_header(), m_coff_header(), m_coff_header_opt(), m_sect_headers(),
441 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
464 bool value_is_offset) {
465 bool changed =
false;
468 size_t num_loaded_sections = 0;
471 if (!value_is_offset) {
475 const size_t num_sections = section_list->
GetSize();
478 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
482 if (section_sp && !section_sp->IsThreadSpecific()) {
484 section_sp, section_sp->GetFileAddress() + value))
485 ++num_loaded_sections;
488 changed = num_loaded_sections > 0;
513#if defined(__LITTLE_ENDIAN__)
522 bool success =
false;
599 bool success =
false;
601 if (*offset_ptr < end_offset) {
614 if (*offset_ptr < end_offset) {
621 if (*offset_ptr < end_offset) {
647 uint32_t num_data_dir_entries =
m_data.
GetU32(offset_ptr);
651 for (i = 0; i < num_data_dir_entries; i++) {
661 *offset_ptr = end_offset;
691 auto data_up = std::make_unique<DataBufferHeap>(size, 0);
694 process_sp->ReadMemory(
m_image_base + offset, data_up->GetBytes(),
695 data_up->GetByteSize(), readmem_error);
696 if (bytes_read == size) {
698 data.
SetData(buffer_sp, 0, buffer_sp->GetByteSize());
709 rva = sect->GetFileOffset() + addr.
GetOffset();
716 uint32_t section_header_data_offset) {
723 ReadImageData(section_header_data_offset, section_header_byte_size);
726 if (section_header_data.ValidOffsetForDataOfSize(
727 offset, section_header_byte_size)) {
730 for (uint32_t idx = 0; idx < nsects; ++idx) {
731 const void *name_data = section_header_data.GetData(&offset, 8);
739 m_sect_headers[idx].lineoff = section_header_data.GetU32(&offset);
752 llvm::StringRef hdr_name(sect.
name, std::size(sect.
name));
753 hdr_name = hdr_name.split(
'\0').first;
754 if (hdr_name.consume_front(
"/")) {
756 if (!to_integer(hdr_name, stroff, 10))
774 const std::pair<uint32_t, uint32_t> &b) {
775 return a.first < b.first;
781 const uint32_t num_syms =
m_binary->getNumberOfSymbols();
785 if (
m_binary->getSymbolTableEntrySize() !=
786 sizeof(llvm::object::coff_symbol16))
791 for (
const auto &sym_ref :
m_binary->symbols()) {
792 const auto coff_sym_ref =
m_binary->getCOFFSymbol(sym_ref);
793 auto name_or_error = sym_ref.getName();
794 if (!name_or_error) {
796 "ObjectFilePECOFF::AppendFromCOFFSymbolTable - failed to "
797 "get symbol table entry name: {0}");
800 const llvm::StringRef sym_name = *name_or_error;
803 int16_t section_number =
804 static_cast<int16_t
>(coff_sym_ref.getSectionNumber());
805 if (section_number >= 1) {
808 const auto symbol_type =
MapSymbolType(coff_sym_ref.getType());
814 const auto &first_match = std::lower_bound(
815 sorted_exports.begin(), sorted_exports.end(),
817 for (
auto it = first_match;
818 it != sorted_exports.end() && it->first == symbol_rva; ++it) {
821 exported->
SetType(symbol_type);
837 }
else if (section_number == llvm::COFF::IMAGE_SYM_ABSOLUTE) {
848 const auto *export_table =
m_binary->getExportTable();
851 const uint32_t num_syms = export_table->AddressTableEntries;
859 for (
const auto &entry :
m_binary->export_directories()) {
860 llvm::StringRef sym_name;
861 if (
auto err = entry.getSymbolName(sym_name)) {
865 "ObjectFilePECOFF::AppendFromExportTable - failed to get export "
866 "table entry name: {0}",
867 llvm::fmt_consume(std::move(err)));
869 llvm::consumeError(std::move(err));
877 llvm::cantFail(entry.getOrdinal(ordinal));
878 symbol.
SetID(ordinal);
881 llvm::cantFail(entry.isForwarder(is_forwarder));
885 llvm::StringRef forwarder_name;
886 if (
auto err = entry.getForwardTo(forwarder_name)) {
888 log->
Format(__FILE__, __func__,
889 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
890 "forwarder name of forwarder export '{0}': {1}",
891 sym_name, llvm::fmt_consume(std::move(err)));
893 llvm::consumeError(std::move(err));
897 " (forwarded to ", forwarder_name,
903 uint32_t function_rva;
904 if (
auto err = entry.getExportRVA(function_rva)) {
906 log->
Format(__FILE__, __func__,
907 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
908 "address of export entry '{0}': {1}",
909 sym_name, llvm::fmt_consume(std::move(err)));
911 llvm::consumeError(std::move(err));
915 if (function_rva == 0 && sym_name.empty())
925 if (section_sp->GetPermissions() & ePermissionsExecutable)
929 export_list.push_back(std::make_pair(function_rva, idx));
931 std::stable_sort(export_list.begin(), export_list.end(),
942 if (!data_dir_exception.
vmaddr)
948 return std::make_unique<PECallFrameInfo>(*
this, data_dir_exception.
vmaddr,
949 data_dir_exception.
vmsize);
967 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE &&
968 ((const_sect_name == g_code_sect_name) ||
969 (const_sect_name == g_CODE_sect_name))) {
972 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA &&
973 ((const_sect_name == g_data_sect_name) ||
974 (const_sect_name == g_DATA_sect_name))) {
980 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA &&
981 ((const_sect_name == g_bss_sect_name) ||
982 (const_sect_name == g_BSS_sect_name))) {
990 llvm::StringSwitch<SectionType>(sect_name)
1014 return section_type;
1016 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE)
1018 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
1020 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) {
1045 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1047 SectionSP header_sp = std::make_shared<Section>(
1054 header_sp->SetPermissions(ePermissionsReadable);
1059 for (uint32_t idx = 0; idx < nsects; ++idx) {
1081 uint32_t permissions = 0;
1082 if (
m_sect_headers[idx].flags & llvm::COFF::IMAGE_SCN_MEM_EXECUTE)
1083 permissions |= ePermissionsExecutable;
1085 permissions |= ePermissionsReadable;
1087 permissions |= ePermissionsWritable;
1088 section_sp->SetPermissions(permissions);
1108 std::string gnu_debuglink_file;
1109 uint32_t gnu_debuglink_crc;
1111 return FileSpec(gnu_debuglink_file);
1112 return std::nullopt;
1120 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1129 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
1135 for (
const auto &entry :
m_binary->import_directories()) {
1136 llvm::StringRef dll_name;
1138 if (llvm::Error e = entry.getName(dll_name)) {
1140 "ObjectFilePECOFF::ParseDependentModules() - failed to get "
1141 "import directory entry name: %s",
1142 llvm::toString(std::move(e)).c_str());
1149 llvm::SmallString<128> dll_fullpath;
1153 if (!llvm::sys::fs::real_path(dll_specs.
GetPath(), dll_fullpath))
1165 auto original_size = files.
GetSize();
1167 for (
unsigned i = 0; i < num_modules; ++i)
1170 return files.
GetSize() - original_size;
1202 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1203 s->
Printf(
"%p: ",
static_cast<void *
>(
this));
1209 *s <<
", file = '" <<
m_file
1255 s->
Printf(
" e_res[4] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1259 s->
Printf(
" e_res2[10] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, "
1260 "0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1288 s->
Printf(
" major_linker_version = 0x%2.2x\n",
1290 s->
Printf(
" minor_linker_version = 0x%2.2x\n",
1298 s->
Printf(
" image_base = 0x%16.16" PRIx64
"\n",
1302 s->
Printf(
" major_os_system_version = 0x%4.4x\n",
1304 s->
Printf(
" minor_os_system_version = 0x%4.4x\n",
1306 s->
Printf(
" major_image_version = 0x%4.4x\n",
1308 s->
Printf(
" minor_image_version = 0x%4.4x\n",
1310 s->
Printf(
" major_subsystem_version = 0x%4.4x\n",
1312 s->
Printf(
" minor_subsystem_version = 0x%4.4x\n",
1320 s->
Printf(
" stack_reserve_size = 0x%16.16" PRIx64
"\n",
1322 s->
Printf(
" stack_commit_size = 0x%16.16" PRIx64
"\n",
1324 s->
Printf(
" heap_reserve_size = 0x%16.16" PRIx64
"\n",
1326 s->
Printf(
" heap_commit_size = 0x%16.16" PRIx64
"\n",
1329 s->
Printf(
" num_data_dir_entries = 0x%8.8x\n",
1332 for (i = 0; i < header.
data_dirs.size(); i++) {
1333 s->
Printf(
" data_dirs[%2u] vmaddr = 0x%8.8x, vmsize = 0x%8.8x\n", i,
1343 s->
Printf(
"%-16s 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%4.4x "
1344 "0x%4.4x 0x%8.8x\n",
1355 s->
PutCString(
"IDX name vm addr vm size file off file "
1356 "size reloc off line off nreloc nline flags\n");
1357 s->
PutCString(
"==== ---------------- ---------- ---------- ---------- "
1358 "---------- ---------- ---------- ------ ------ ----------\n");
1364 s->
Printf(
"[%2u] ", idx);
1374 if (num_modules > 0) {
1376 for (
unsigned i = 0; i < num_modules; ++i) {
1378 s->
Printf(
" %s\n", spec.GetFilename().GetCString());
1385 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE:
1386 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI:
1387 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI:
1388 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE_WINDOWS:
1389 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
1390 case llvm::COFF::IMAGE_SUBSYSTEM_XBOX:
1391 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION:
1403 case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
1404 case llvm::COFF::IMAGE_FILE_MACHINE_I386:
1405 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPC:
1406 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP:
1407 case llvm::COFF::IMAGE_FILE_MACHINE_ARM:
1408 case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
1409 case llvm::COFF::IMAGE_FILE_MACHINE_THUMB:
1410 case llvm::COFF::IMAGE_FILE_MACHINE_ARM64:
1414 : llvm::Triple::UnknownOS);
static llvm::raw_ostream & error(Stream &strm)
static PluginProperties & GetGlobalPluginProperties()
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static PluginProperties & GetGlobalPluginProperties()
#define OPT_HEADER_MAGIC_PE32
#define OPT_HEADER_MAGIC_PE32_PLUS
static bool RVASymbolListCompareRVA(const std::pair< uint32_t, uint32_t > &a, const std::pair< uint32_t, uint32_t > &b)
#define IMAGE_NT_SIGNATURE
static UUID GetCoffUUID(llvm::object::COFFObjectFile &coff_obj)
static bool GetDebugLinkContents(const llvm::object::COFFObjectFile &coff_obj, std::string &gnu_debuglink_file, uint32_t &gnu_debuglink_crc)
#define IMAGE_DOS_SIGNATURE
#define LLDB_PLUGIN_DEFINE(PluginName)
#define LLDB_SCOPED_TIMERF(...)
ObjectFile::Strata CalculateStrata() override
The object file should be able to calculate the strata of the object file.
static bool SaveCore(const lldb::ProcessSP &process_sp, const lldb_private::FileSpec &outfile, lldb::SaveCoreStyle &core_style, lldb_private::Status &error)
bool IsExecutable() const override
Tells whether this object file is capable of being the main executable for a process.
void DumpSectionHeaders(lldb_private::Stream *s)
std::unique_ptr< llvm::object::COFFObjectFile > m_binary
dos_header_t m_dos_header
lldb_private::DataExtractor ReadImageDataByRVA(uint32_t rva, size_t size)
llvm::StringRef GetSectionName(const section_header_t §)
lldb_private::Address GetEntryPointAddress() override
Returns the address of the Entry Point in this object file - if the object file doesn't have an entry...
std::optional< lldb_private::FileSpecList > m_deps_filespec
~ObjectFilePECOFF() override
static bool ParseDOSHeader(lldb_private::DataExtractor &data, dos_header_t &dos_header)
uint32_t GetDependentModules(lldb_private::FileSpecList &files) override
Extract the dependent modules from an object file.
lldb_private::Address GetBaseAddress() override
Returns base address of this object file.
bool IsWindowsSubsystem()
lldb::addr_t m_image_base
void DumpSectionHeader(lldb_private::Stream *s, const section_header_t &sh)
std::unique_ptr< lldb_private::CallFrameInfo > CreateCallFrameInfo() override
Creates a plugin-specific call frame info.
size_t GetSectionDataSize(lldb_private::Section *section) override
static void DebuggerInitialize(lldb_private::Debugger &debugger)
ObjectFilePECOFF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, lldb::offset_t data_offset, const lldb_private::FileSpec *file, lldb::offset_t file_offset, lldb::offset_t length)
ObjectFile::Type CalculateType() override
The object file should be able to calculate its type by looking at its file header and possibly the s...
lldb_private::ArchSpec GetArchitecture() override
Get the ArchSpec for this object file.
static void DumpCOFFHeader(lldb_private::Stream *s, const coff_header_t &header)
bool ParseHeader() override
Attempts to parse the object header.
struct ObjectFilePECOFF::section_header section_header_t
void DumpDependentModules(lldb_private::Stream *s)
lldb_private::UUID m_uuid
lldb_private::UUID GetUUID() override
Gets the UUID for this object file.
std::vector< std::pair< uint32_t, uint32_t > > rva_symbol_list_t
static llvm::StringRef GetPluginNameStatic()
bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value, bool value_is_offset) override
Sets the load address for an entire module, assuming a rigid slide of sections, if possible in the im...
SectionHeaderColl::iterator SectionHeaderCollIter
SectionHeaderColl m_sect_headers
static lldb_private::ObjectFile * CreateMemoryInstance(const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr)
static llvm::StringRef GetPluginDescriptionStatic()
coff_opt_header_t m_coff_header_opt
bool ParseCOFFOptionalHeader(lldb::offset_t *offset_ptr)
bool IsStripped() override
Detect if this object file has been stripped of local symbols.
uint32_t ParseDependentModules()
bool NeedsEndianSwap() const
lldb::addr_t GetFileAddress(uint32_t rva) const
void ParseSymtab(lldb_private::Symtab &symtab) override
Parse the symbol table into the provides symbol table object.
void CreateSections(lldb_private::SectionList &unified_section_list) override
void Dump(lldb_private::Stream *s) override
Dump a description of this object to a Stream.
rva_symbol_list_t AppendFromExportTable(lldb_private::SectionList *sect_list, lldb_private::Symtab &symtab)
coff_header_t m_coff_header
lldb_private::Address GetAddress(uint32_t rva)
lldb::ByteOrder GetByteOrder() const override
Gets whether endian swapping should occur when extracting data from this object file.
lldb_private::DataExtractor ReadImageData(uint32_t offset, size_t size)
void AppendFromCOFFSymbolTable(lldb_private::SectionList *sect_list, lldb_private::Symtab &symtab, const rva_symbol_list_t &sorted_exports)
std::optional< lldb_private::FileSpec > GetDebugLink()
Return the contents of the .gnu_debuglink section, if the object file contains it.
bool ParseSectionHeaders(uint32_t offset)
static lldb::SymbolType MapSymbolType(uint16_t coff_symbol_type)
uint32_t GetRVA(const lldb_private::Address &addr) const
uint32_t GetAddressByteSize() const override
Gets the address size in bytes for the current object file.
static void DumpOptCOFFHeader(lldb_private::Stream *s, const coff_opt_header_t &header)
static lldb::SectionType GetSectionType(llvm::StringRef sect_name, const section_header_t §)
static ObjectFile * CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, lldb::offset_t data_offset, const lldb_private::FileSpec *file, lldb::offset_t offset, lldb::offset_t length)
static bool ParseCOFFHeader(lldb_private::DataExtractor &data, lldb::offset_t *offset_ptr, coff_header_t &coff_header)
static bool MagicBytesMatch(lldb::DataBufferSP data_sp)
lldb_private::Address m_entry_point_address
static void DumpDOSHeader(lldb_private::Stream *s, const dos_header_t &header)
static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, lldb::offset_t length, lldb_private::ModuleSpecList &specs)
A section + offset based address class.
bool ResolveAddressUsingFileSections(lldb::addr_t addr, const SectionList *sections)
Resolve a file virtual address using a section list.
lldb::SectionSP GetSection() const
Get const accessor for the section.
lldb::addr_t GetFileAddress() const
Get the file address.
lldb::addr_t GetOffset() const
Get the section relative offset value.
bool IsValid() const
Check if the object state is valid.
bool SetOffset(lldb::addr_t offset)
Set accessor for the offset.
An architecture specification class.
llvm::Triple & GetTriple()
Architecture triple accessor.
bool SetTriple(const llvm::Triple &triple)
Architecture triple setter.
bool SetArchitecture(ArchitectureType arch_type, uint32_t cpu, uint32_t sub, uint32_t os=0)
Change the architecture object type, CPU type and OS type.
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
A uniqued constant string class.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
A class to manage flag bits.
size_t GetSize() const
Get the number of files in the file list.
bool AppendIfUnique(const FileSpec &file)
Append a FileSpec object if unique.
void SetDirectory(ConstString directory)
Directory string set accessor.
const ConstString & GetFilename() const
Filename string const get accessor.
const ConstString & GetDirectory() const
Directory string const get accessor.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
void Format(llvm::StringRef file, llvm::StringRef function, const char *format, Args &&... args)
void SetDemangledName(ConstString name)
void SetValue(ConstString name)
Set the string value in this object.
lldb::ModuleSP GetModule() const
Get const accessor for the module pointer.
void Append(const ModuleSpec &spec)
ArchSpec & GetArchitecture()
A plug-in interface definition class for object file parsers.
DataExtractor m_data
The data for this object file so things can be parsed lazily.
std::unique_ptr< lldb_private::SectionList > m_sections_up
static lldb::DataBufferSP MapFileData(const FileSpec &file, uint64_t Size, uint64_t Offset)
std::unique_ptr< lldb_private::Symtab > m_symtab_up
@ eTypeExecutable
A normal executable.
@ eTypeSharedLibrary
A shared library that can be used during execution.
virtual SectionList * GetSectionList(bool update_module_section_list=true)
Gets the section list for the currently selected architecture (and object for archives).
lldb::ProcessWP m_process_wp
static lldb::OptionValuePropertiesSP GetSettingForObjectFilePlugin(Debugger &debugger, llvm::StringRef setting_name)
static bool CreateSettingForObjectFilePlugin(Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, llvm::StringRef description, bool is_global_property)
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
lldb::SectionSP FindSectionByID(lldb::user_id_t sect_id) const
size_t AddSection(const lldb::SectionSP §ion_sp)
void Dump(llvm::raw_ostream &s, unsigned indent, Target *target, bool show_header, uint32_t depth) const
lldb::SectionSP GetSectionAtIndex(size_t idx) const
bool SetSectionLoadAddress(const lldb::SectionSP §ion_sp, lldb::addr_t load_addr, bool warn_multiple=false)
lldb::addr_t GetByteSize() const
lldb::offset_t GetFileSize() const
A stream class that can stream formatted output to a file.
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
size_t Indent(llvm::StringRef s="")
Indent the current line in the stream.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
size_t EOL()
Output and End of Line character to the stream.
unsigned GetIndentLevel() const
Get the current indentation level.
void SetType(lldb::SymbolType type)
Address & GetAddressRef()
lldb::SymbolType GetType() const
void SetDemangledNameIsSynthesized(bool b)
ConstString GetDisplayName() const
Symbol * SymbolAtIndex(size_t idx)
uint32_t AddSymbol(const Symbol &symbol)
size_t GetNumSymbols() const
void Reserve(size_t count)
SectionLoadList & GetSectionLoadList()
#define LLDB_INVALID_CPUTYPE
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
bool SaveMiniDump(const lldb::ProcessSP &process_sp, const lldb_private::FileSpec &outfile, lldb_private::Status &error)
std::shared_ptr< lldb_private::Process > ProcessSP
@ eSymbolTypeAdditional
When symbols take more than one entry, the extra entries get this type.
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::Section > SectionSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
@ eSectionTypeDWARFDebugPubNames
@ eSectionTypeDWARFDebugFrame
@ eSectionTypeDWARFDebugLocLists
DWARF v5 .debug_loclists.
@ eSectionTypeDWARFDebugTypes
DWARF .debug_types section.
@ eSectionTypeDWARFDebugMacInfo
@ eSectionTypeDWARFDebugNames
DWARF v5 .debug_names.
@ eSectionTypeDWARFDebugInfo
@ eSectionTypeDWARFDebugRanges
@ eSectionTypeDWARFDebugLine
@ eSectionTypeDWARFDebugPubTypes
@ eSectionTypeDWARFDebugStr
@ eSectionTypeDWARFDebugLoc
@ eSectionTypeSwiftModules
@ eSectionTypeDWARFDebugAranges
@ eSectionTypeDWARFDebugAbbrev
@ eSectionTypeDataCString
Inlined C string data.
std::shared_ptr< lldb_private::Module > ModuleSP
std::shared_ptr< lldb_private::OptionValue > OptionValueSP
struct lldb_private::UUID::CvRecordPdb70::@42 Uuid
llvm::support::ulittle32_t Age