34#include "llvm/BinaryFormat/COFF.h"
35#include "llvm/Object/COFFImportFile.h"
36#include "llvm/Support/CRC.h"
37#include "llvm/Support/Error.h"
38#include "llvm/Support/FormatAdapters.h"
39#include "llvm/Support/MemoryBuffer.h"
40#include "llvm/TargetParser/Host.h"
43#define IMAGE_DOS_SIGNATURE 0x5A4D
44#define IMAGE_NT_SIGNATURE 0x00004550
45#define OPT_HEADER_MAGIC_PE32 0x010b
46#define OPT_HEADER_MAGIC_PE32_PLUS 0x020b
55static constexpr OptionEnumValueElement g_abi_enums[] = {
57 llvm::Triple::UnknownEnvironment,
59 "Use default target (if it is Windows) or MSVC",
69 "MinGW / Itanium ABI",
73#define LLDB_PROPERTIES_objectfilepecoff
74#include "ObjectFilePECOFFProperties.inc"
77#define LLDB_PROPERTIES_objectfilepecoff
78#include "ObjectFilePECOFFPropertiesEnum.inc"
88 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
89 m_collection_sp->Initialize(g_objectfilepecoff_properties);
92 llvm::Triple::EnvironmentType
ABI()
const {
93 return GetPropertyAtIndexAs<llvm::Triple::EnvironmentType>(
94 ePropertyABI, llvm::Triple::UnknownEnvironment);
98 return m_collection_sp->GetPropertyAtIndexAsOptionValueDictionary(
99 ePropertyModuleABIMap);
106 static PluginProperties g_settings;
111 std::string &gnu_debuglink_file,
113 static ConstString g_sect_name_gnu_debuglink(
".gnu_debuglink");
114 for (
const auto §ion : coff_obj.sections()) {
115 auto name = section.getName();
117 llvm::consumeError(name.takeError());
120 if (*name == g_sect_name_gnu_debuglink.
GetStringRef()) {
121 auto content = section.getContents();
123 llvm::consumeError(content.takeError());
127 content->data(), content->size(),
130 gnu_debuglink_file = data.
GetCStr(&gnu_debuglink_offset);
132 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4);
133 data.
GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
141 const llvm::codeview::DebugInfo *pdb_info =
nullptr;
142 llvm::StringRef pdb_file;
146 if (!coff_obj.getDebugPDBInfo(pdb_info, pdb_file) && pdb_info) {
147 if (pdb_info->PDB70.CVSignature == llvm::OMF::Signature::PDB70) {
149 memcpy(&info.
Uuid, pdb_info->PDB70.Signature,
sizeof(info.
Uuid));
150 info.
Age = pdb_info->PDB70.Age;
155 std::string gnu_debuglink_file;
165 auto raw_data = coff_obj.getData();
167 "Calculating module crc32 %s with size %" PRIu64
" KiB",
170 gnu_debuglink_crc = llvm::crc32(0, llvm::arrayRefFromStringRef(raw_data));
173 llvm::support::ulittle32_t data(gnu_debuglink_crc);
174 return UUID(&data,
sizeof(data));
188 debugger, PluginProperties::GetSettingName())) {
189 const bool is_global_setting =
true;
192 "Properties for the PE/COFF object-file plug-in.", is_global_setting);
201 return "Portable Executable and Common Object File Format object file reader "
206 const lldb::ModuleSP &module_sp, DataBufferSP data_sp,
221 if (data_sp->GetByteSize() < length) {
227 auto objfile_up = std::make_unique<ObjectFilePECOFF>(
228 module_sp, data_sp, data_offset, file_p, file_offset, length);
229 if (!objfile_up || !objfile_up->ParseHeader())
233 if (!objfile_up->CreateBinary())
235 return objfile_up.release();
239 const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp,
240 const lldb::ProcessSP &process_sp,
lldb::addr_t header_addr) {
243 auto objfile_up = std::make_unique<ObjectFilePECOFF>(
244 module_sp, data_sp, process_sp, header_addr);
245 if (objfile_up.get() && objfile_up->ParseHeader()) {
246 return objfile_up.release();
255 const size_t initial_count = specs.
GetSize();
257 return initial_count;
261 if (data_sp->GetByteSize() < length)
262 if (DataBufferSP full_sp =
MapFileData(file, -1, file_offset))
263 data_sp = std::move(full_sp);
264 auto binary = llvm::object::createBinary(llvm::MemoryBufferRef(
269 "Failed to create binary for file ({1}): {0}", file);
270 return initial_count;
273 auto *COFFObj = llvm::dyn_cast<llvm::object::COFFObjectFile>(binary->get());
275 return initial_count;
283 static llvm::Triple::EnvironmentType default_env = [] {
284 auto def_target = llvm::Triple(
285 llvm::Triple::normalize(llvm::sys::getDefaultTargetTriple()));
286 if (def_target.getOS() == llvm::Triple::Win32 &&
287 def_target.getEnvironment() != llvm::Triple::UnknownEnvironment)
288 return def_target.getEnvironment();
289 return llvm::Triple::MSVC;
293 OptionValueSP module_env_option;
295 if (map->GetNumValues() > 0) {
298 module_env_option = map->GetValueForKey(name);
299 if (!module_env_option) {
302 module_env_option = map->GetValueForKey(llvm::StringRef(name_lower));
304 if (!module_env_option) {
306 auto name_stripped = name.GetStringRef();
307 if (name_stripped.consume_back_insensitive(
".debug")) {
308 module_env_option = map->GetValueForKey(name_stripped);
309 if (!module_env_option) {
312 auto name_lower = name_stripped.lower();
313 module_env_option = map->GetValueForKey(llvm::StringRef(name_lower));
318 llvm::Triple::EnvironmentType env;
319 if (module_env_option)
321 module_env_option->GetValueAs<llvm::Triple::EnvironmentType>().value_or(
322 static_cast<llvm::Triple::EnvironmentType
>(0));
326 if (env == llvm::Triple::UnknownEnvironment)
329 switch (COFFObj->getMachine()) {
333 specs.
Append(module_spec);
338 specs.
Append(module_spec);
343 specs.
Append(module_spec);
348 specs.
Append(module_spec);
354 return specs.
GetSize() - initial_count;
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}",
417 DataBufferSP data_sp,
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(),
428 WritableDataBufferSP header_data_sp,
429 const lldb::ProcessSP &process_sp,
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) {
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) {
697 DataBufferSP buffer_sp(data_up.release());
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;
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 (
auto err = name_or_error.takeError()) {
796 "ObjectFilePECOFF::AppendFromCOFFSymbolTable - failed to get "
797 "symbol table entry name: {0}",
798 llvm::fmt_consume(std::move(err)));
801 const llvm::StringRef sym_name = *name_or_error;
804 int16_t section_number =
805 static_cast<int16_t
>(coff_sym_ref.getSectionNumber());
806 if (section_number >= 1) {
809 const auto symbol_type =
MapSymbolType(coff_sym_ref.getType());
815 const auto &first_match = std::lower_bound(
816 sorted_exports.begin(), sorted_exports.end(),
818 for (
auto it = first_match;
819 it != sorted_exports.end() && it->first == symbol_rva; ++it) {
822 exported->
SetType(symbol_type);
838 }
else if (section_number == llvm::COFF::IMAGE_SYM_ABSOLUTE) {
849 const auto *export_table =
m_binary->getExportTable();
852 const uint32_t num_syms = export_table->AddressTableEntries;
860 for (
const auto &entry :
m_binary->export_directories()) {
861 llvm::StringRef sym_name;
862 if (
auto err = entry.getSymbolName(sym_name)) {
866 "ObjectFilePECOFF::AppendFromExportTable - failed to get export "
867 "table entry name: {0}",
868 llvm::fmt_consume(std::move(err)));
870 llvm::consumeError(std::move(err));
878 llvm::cantFail(entry.getOrdinal(ordinal));
879 symbol.
SetID(ordinal);
882 llvm::cantFail(entry.isForwarder(is_forwarder));
886 llvm::StringRef forwarder_name;
887 if (
auto err = entry.getForwardTo(forwarder_name)) {
889 log->
Format(__FILE__, __func__,
890 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
891 "forwarder name of forwarder export '{0}': {1}",
892 sym_name, llvm::fmt_consume(std::move(err)));
894 llvm::consumeError(std::move(err));
898 " (forwarded to ", forwarder_name,
905 if (
auto err = entry.getExportRVA(function_rva)) {
907 log->
Format(__FILE__, __func__,
908 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
909 "address of export entry '{0}': {1}",
910 sym_name, llvm::fmt_consume(std::move(err)));
912 llvm::consumeError(std::move(err));
916 if (function_rva == 0 && sym_name.empty())
926 if (section_sp->GetPermissions() & ePermissionsExecutable)
930 export_list.push_back(std::make_pair(function_rva, idx));
932 std::stable_sort(export_list.begin(), export_list.end(),
943 if (!data_dir_exception.
vmaddr)
949 return std::make_unique<PECallFrameInfo>(*
this, data_dir_exception.
vmaddr,
950 data_dir_exception.
vmsize);
968 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE &&
969 ((const_sect_name == g_code_sect_name) ||
970 (const_sect_name == g_CODE_sect_name))) {
973 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA &&
974 ((const_sect_name == g_data_sect_name) ||
975 (const_sect_name == g_DATA_sect_name))) {
981 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA &&
982 ((const_sect_name == g_bss_sect_name) ||
983 (const_sect_name == g_BSS_sect_name))) {
991 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) {
1035 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1037 SectionSP header_sp = std::make_shared<Section>(
1044 header_sp->SetPermissions(ePermissionsReadable);
1049 for (
uint32_t idx = 0; idx < nsects; ++idx) {
1054 SectionSP section_sp(
new Section(
1072 if (
m_sect_headers[idx].flags & llvm::COFF::IMAGE_SCN_MEM_EXECUTE)
1073 permissions |= ePermissionsExecutable;
1075 permissions |= ePermissionsReadable;
1077 permissions |= ePermissionsWritable;
1078 section_sp->SetPermissions(permissions);
1098 std::string gnu_debuglink_file;
1101 return FileSpec(gnu_debuglink_file);
1102 return std::nullopt;
1110 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1119 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
1125 for (
const auto &entry :
m_binary->import_directories()) {
1126 llvm::StringRef dll_name;
1128 if (llvm::Error e = entry.getName(dll_name)) {
1130 "ObjectFilePECOFF::ParseDependentModules() - failed to get "
1131 "import directory entry name: %s",
1132 llvm::toString(std::move(e)).c_str());
1139 llvm::SmallString<128> dll_fullpath;
1143 if (!llvm::sys::fs::real_path(dll_specs.
GetPath(), dll_fullpath))
1155 auto original_size = files.
GetSize();
1157 for (
unsigned i = 0; i < num_modules; ++i)
1160 return files.
GetSize() - original_size;
1192 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1193 s->
Printf(
"%p: ",
static_cast<void *
>(
this));
1199 *s <<
", file = '" <<
m_file
1245 s->
Printf(
" e_res[4] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1249 s->
Printf(
" e_res2[10] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, "
1250 "0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1278 s->
Printf(
" major_linker_version = 0x%2.2x\n",
1280 s->
Printf(
" minor_linker_version = 0x%2.2x\n",
1288 s->
Printf(
" image_base = 0x%16.16" PRIx64
"\n",
1292 s->
Printf(
" major_os_system_version = 0x%4.4x\n",
1294 s->
Printf(
" minor_os_system_version = 0x%4.4x\n",
1296 s->
Printf(
" major_image_version = 0x%4.4x\n",
1298 s->
Printf(
" minor_image_version = 0x%4.4x\n",
1300 s->
Printf(
" major_subsystem_version = 0x%4.4x\n",
1302 s->
Printf(
" minor_subsystem_version = 0x%4.4x\n",
1310 s->
Printf(
" stack_reserve_size = 0x%16.16" PRIx64
"\n",
1312 s->
Printf(
" stack_commit_size = 0x%16.16" PRIx64
"\n",
1314 s->
Printf(
" heap_reserve_size = 0x%16.16" PRIx64
"\n",
1316 s->
Printf(
" heap_commit_size = 0x%16.16" PRIx64
"\n",
1319 s->
Printf(
" num_data_dir_entries = 0x%8.8x\n",
1322 for (i = 0; i < header.
data_dirs.size(); i++) {
1323 s->
Printf(
" data_dirs[%2u] vmaddr = 0x%8.8x, vmsize = 0x%8.8x\n", i,
1333 s->
Printf(
"%-16s 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%4.4x "
1334 "0x%4.4x 0x%8.8x\n",
1345 s->
PutCString(
"IDX name vm addr vm size file off file "
1346 "size reloc off line off nreloc nline flags\n");
1347 s->
PutCString(
"==== ---------------- ---------- ---------- ---------- "
1348 "---------- ---------- ---------- ------ ------ ----------\n");
1354 s->
Printf(
"[%2u] ", idx);
1364 if (num_modules > 0) {
1366 for (
unsigned i = 0; i < num_modules; ++i) {
1368 s->
Printf(
" %s\n", spec.GetFilename().GetCString());
1375 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE:
1376 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI:
1377 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI:
1378 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE_WINDOWS:
1379 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
1380 case llvm::COFF::IMAGE_SUBSYSTEM_XBOX:
1381 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION:
1393 case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
1394 case llvm::COFF::IMAGE_FILE_MACHINE_I386:
1395 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPC:
1396 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP:
1397 case llvm::COFF::IMAGE_FILE_MACHINE_ARM:
1398 case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
1399 case llvm::COFF::IMAGE_FILE_MACHINE_THUMB:
1400 case llvm::COFF::IMAGE_FILE_MACHINE_ARM64:
1404 : 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.
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)
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, ConstString 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)
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)
@ eSymbolTypeAdditional
When symbols take more than one entry, the extra entries get this type.
ByteOrder
Byte ordering definitions.
@ eSectionTypeDWARFDebugPubNames
@ eSectionTypeDWARFDebugFrame
@ eSectionTypeDWARFDebugLocLists
DWARF v5 .debug_loclists.
@ eSectionTypeDWARFDebugTypes
DWARF .debug_types section.
@ eSectionTypeDWARFDebugMacInfo
@ eSectionTypeDWARFDebugNames
DWARF v5 .debug_names.
@ eSectionTypeDWARFDebugInfo
@ eSectionTypeDWARFDebugRanges
@ eSectionTypeDWARFDebugLine
@ eSectionTypeDWARFDebugPubTypes
@ eSectionTypeDWARFDebugStr
@ eSectionTypeDWARFDebugLoc
@ eSectionTypeDWARFDebugAranges
@ eSectionTypeDWARFDebugAbbrev
@ eSectionTypeDataCString
Inlined C string data.
struct lldb_private::UUID::CvRecordPdb70::@43 Uuid
llvm::support::ulittle32_t Age