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
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"
83 static llvm::StringRef GetSettingName() {
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);
97 OptionValueDictionary *ModuleABIMap()
const {
98 return m_collection_sp->GetPropertyAtIndexAsOptionValueDictionary(
99 ePropertyModuleABIMap);
106 static PluginProperties g_settings;
111 std::string &gnu_debuglink_file,
112 uint32_t &gnu_debuglink_crc) {
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;
156 uint32_t gnu_debuglink_crc;
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 "
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();
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)
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;
295 if (map->GetNumValues() > 0) {
298 module_env_option = map->GetValueForKey(name);
299 if (!module_env_option) {
301 auto name_lower = name.GetStringRef().lower();
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);
349 specs.
Append(module_spec);
355 return specs.
GetSize() - initial_count;
370 uint16_t magic = data.
GetU16(&offset);
377 const auto complex_type =
378 coff_symbol_type >> llvm::COFF::SCT_COMPLEX_TYPE_SHIFT;
379 if (complex_type == llvm::COFF::IMAGE_SYM_DTYPE_FUNCTION) {
382 const auto base_type = coff_symbol_type & 0xff;
383 if (base_type == llvm::COFF::IMAGE_SYM_TYPE_NULL &&
384 complex_type == llvm::COFF::IMAGE_SYM_DTYPE_NULL) {
398 auto binary = llvm::object::createBinary(llvm::MemoryBufferRef(
399 toStringRef(
m_data.GetData()),
m_file.GetFilename().GetStringRef()));
402 "Failed to create binary for file ({1}): {0}",
m_file);
408 llvm::unique_dyn_cast<llvm::object::COFFObjectFile>(std::move(*binary));
412 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
424 :
ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
433 :
ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
443 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
450 uint32_t pe_signature =
m_data.GetU32(&offset);
466 bool value_is_offset) {
467 bool changed =
false;
470 size_t num_loaded_sections = 0;
473 if (!value_is_offset) {
477 const size_t num_sections = section_list->
GetSize();
480 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
484 if (section_sp && !section_sp->IsThreadSpecific()) {
486 section_sp, section_sp->GetFileAddress() + value))
487 ++num_loaded_sections;
490 changed = num_loaded_sections > 0;
499 return (
m_coff_header.flags & llvm::COFF::IMAGE_FILE_DLL) == 0;
515#if defined(__LITTLE_ENDIAN__)
524 bool success =
false;
601 bool success =
false;
603 if (*offset_ptr < end_offset) {
616 if (*offset_ptr < end_offset) {
623 if (*offset_ptr < end_offset) {
625 m_data.GetMaxU64(offset_ptr, addr_byte_size);
641 m_data.GetMaxU64(offset_ptr, addr_byte_size);
643 m_data.GetMaxU64(offset_ptr, addr_byte_size);
645 m_data.GetMaxU64(offset_ptr, addr_byte_size);
647 m_data.GetMaxU64(offset_ptr, addr_byte_size);
649 uint32_t num_data_dir_entries =
m_data.GetU32(offset_ptr);
653 for (i = 0; i < num_data_dir_entries; i++) {
663 *offset_ptr = end_offset;
687 if (
m_data.ValidOffsetForDataOfSize(offset, size))
693 auto data_up = std::make_unique<DataBufferHeap>(size, 0);
696 process_sp->ReadMemory(
m_image_base + offset, data_up->GetBytes(),
697 data_up->GetByteSize(), readmem_error);
698 if (bytes_read == size) {
700 data.
SetData(buffer_sp, 0, buffer_sp->GetByteSize());
711 rva = sect->GetFileOffset() + addr.
GetOffset();
718 uint32_t section_header_data_offset) {
725 ReadImageData(section_header_data_offset, section_header_byte_size);
728 if (section_header_data.ValidOffsetForDataOfSize(
729 offset, section_header_byte_size)) {
732 for (uint32_t idx = 0; idx < nsects; ++idx) {
733 const void *name_data = section_header_data.GetData(&offset, 8);
741 m_sect_headers[idx].lineoff = section_header_data.GetU32(&offset);
754 llvm::StringRef hdr_name(sect.
name, std::size(sect.
name));
755 hdr_name = hdr_name.split(
'\0').first;
756 if (hdr_name.consume_front(
"/")) {
758 if (!to_integer(hdr_name, stroff, 10))
762 if (
const char *name =
m_data.GetCStr(&string_file_offset))
776 const std::pair<uint32_t, uint32_t> &b) {
777 return a.first < b.first;
783 const uint32_t num_syms =
m_binary->getNumberOfSymbols();
787 if (
m_binary->getSymbolTableEntrySize() !=
788 sizeof(llvm::object::coff_symbol16))
793 for (
const auto &sym_ref :
m_binary->symbols()) {
794 const auto coff_sym_ref =
m_binary->getCOFFSymbol(sym_ref);
795 auto name_or_error = sym_ref.getName();
796 if (!name_or_error) {
798 "ObjectFilePECOFF::AppendFromCOFFSymbolTable - failed to "
799 "get symbol table entry name: {0}");
802 const llvm::StringRef sym_name = *name_or_error;
805 int16_t section_number =
806 static_cast<int16_t
>(coff_sym_ref.getSectionNumber());
807 if (section_number >= 1) {
810 const auto symbol_type =
MapSymbolType(coff_sym_ref.getType());
816 const auto &first_match = std::lower_bound(
817 sorted_exports.begin(), sorted_exports.end(),
819 for (
auto it = first_match;
820 it != sorted_exports.end() && it->first == symbol_rva; ++it) {
823 exported->
SetType(symbol_type);
839 }
else if (section_number == llvm::COFF::IMAGE_SYM_ABSOLUTE) {
850 const auto *export_table =
m_binary->getExportTable();
853 const uint32_t num_syms = export_table->AddressTableEntries;
861 for (
const auto &entry :
m_binary->export_directories()) {
862 llvm::StringRef sym_name;
863 if (
auto err = entry.getSymbolName(sym_name)) {
865 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
866 "export table entry name: {0}");
874 llvm::cantFail(entry.getOrdinal(ordinal));
875 symbol.
SetID(ordinal);
878 llvm::cantFail(entry.isForwarder(is_forwarder));
882 llvm::StringRef forwarder_name;
883 if (
auto err = entry.getForwardTo(forwarder_name)) {
885 "ObjectFilePECOFF::AppendFromExportTable - failed to "
886 "get forwarder name of forwarder export '{1}': {0}",
891 " (forwarded to ", forwarder_name,
897 uint32_t function_rva;
898 if (
auto err = entry.getExportRVA(function_rva)) {
900 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
901 "address of export entry '{1}': {0}",
906 if (function_rva == 0 && sym_name.empty())
916 if (section_sp->GetPermissions() & ePermissionsExecutable)
920 export_list.push_back(std::make_pair(function_rva, idx));
932 if (!data_dir_exception.
vmaddr)
935 if (
m_coff_header.machine != llvm::COFF::IMAGE_FILE_MACHINE_AMD64)
938 return std::make_unique<PECallFrameInfo>(*
this, data_dir_exception.
vmaddr,
939 data_dir_exception.
vmsize);
957 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE &&
958 ((const_sect_name == g_code_sect_name) ||
959 (const_sect_name == g_CODE_sect_name))) {
962 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA &&
963 ((const_sect_name == g_data_sect_name) ||
964 (const_sect_name == g_DATA_sect_name))) {
970 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA &&
971 ((const_sect_name == g_bss_sect_name) ||
972 (const_sect_name == g_BSS_sect_name))) {
979 if (sect_name.consume_front(
".debug_"))
983 llvm::StringSwitch<SectionType>(sect_name)
997 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE)
999 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
1001 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) {
1026 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1028 SectionSP header_sp = std::make_shared<Section>(
1035 header_sp->SetPermissions(ePermissionsReadable);
1040 for (uint32_t idx = 0; idx < nsects; ++idx) {
1062 uint32_t permissions = 0;
1063 if (
m_sect_headers[idx].flags & llvm::COFF::IMAGE_SCN_MEM_EXECUTE)
1064 permissions |= ePermissionsExecutable;
1066 permissions |= ePermissionsReadable;
1068 permissions |= ePermissionsWritable;
1069 section_sp->SetPermissions(permissions);
1089 std::string gnu_debuglink_file;
1090 uint32_t gnu_debuglink_crc;
1092 return FileSpec(gnu_debuglink_file);
1093 return std::nullopt;
1101 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1110 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
1116 for (
const auto &entry :
m_binary->import_directories()) {
1117 llvm::StringRef dll_name;
1119 if (llvm::Error e = entry.getName(dll_name)) {
1121 "ObjectFilePECOFF::ParseDependentModules() - failed to get "
1122 "import directory entry name: %s",
1123 llvm::toString(std::move(e)).c_str());
1130 llvm::SmallString<128> dll_fullpath;
1134 if (!llvm::sys::fs::real_path(dll_specs.
GetPath(), dll_fullpath))
1146 auto original_size = files.
GetSize();
1148 for (
unsigned i = 0; i < num_modules; ++i)
1151 return files.
GetSize() - original_size;
1183 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1184 s->
Printf(
"%p: ",
static_cast<void *
>(
this));
1190 *s <<
", file = '" <<
m_file
1236 s->
Printf(
" e_res[4] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1240 s->
Printf(
" e_res2[10] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, "
1241 "0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1269 s->
Printf(
" major_linker_version = 0x%2.2x\n",
1271 s->
Printf(
" minor_linker_version = 0x%2.2x\n",
1279 s->
Printf(
" image_base = 0x%16.16" PRIx64
"\n",
1283 s->
Printf(
" major_os_system_version = 0x%4.4x\n",
1285 s->
Printf(
" minor_os_system_version = 0x%4.4x\n",
1287 s->
Printf(
" major_image_version = 0x%4.4x\n",
1289 s->
Printf(
" minor_image_version = 0x%4.4x\n",
1291 s->
Printf(
" major_subsystem_version = 0x%4.4x\n",
1293 s->
Printf(
" minor_subsystem_version = 0x%4.4x\n",
1301 s->
Printf(
" stack_reserve_size = 0x%16.16" PRIx64
"\n",
1303 s->
Printf(
" stack_commit_size = 0x%16.16" PRIx64
"\n",
1305 s->
Printf(
" heap_reserve_size = 0x%16.16" PRIx64
"\n",
1307 s->
Printf(
" heap_commit_size = 0x%16.16" PRIx64
"\n",
1310 s->
Printf(
" num_data_dir_entries = 0x%8.8x\n",
1313 for (i = 0; i < header.
data_dirs.size(); i++) {
1314 s->
Printf(
" data_dirs[%2u] vmaddr = 0x%8.8x, vmsize = 0x%8.8x\n", i,
1324 s->
Printf(
"%-16s 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%4.4x "
1325 "0x%4.4x 0x%8.8x\n",
1336 s->
PutCString(
"IDX name vm addr vm size file off file "
1337 "size reloc off line off nreloc nline flags\n");
1338 s->
PutCString(
"==== ---------------- ---------- ---------- ---------- "
1339 "---------- ---------- ---------- ------ ------ ----------\n");
1345 s->
Printf(
"[%2u] ", idx);
1355 if (num_modules > 0) {
1357 for (
unsigned i = 0; i < num_modules; ++i) {
1359 s->
Printf(
" %s\n", spec.GetFilename().GetCString());
1366 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE:
1367 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI:
1368 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI:
1369 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE_WINDOWS:
1370 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
1371 case llvm::COFF::IMAGE_SUBSYSTEM_XBOX:
1372 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION:
1384 case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
1385 case llvm::COFF::IMAGE_FILE_MACHINE_I386:
1386 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPC:
1387 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP:
1388 case llvm::COFF::IMAGE_FILE_MACHINE_ARM:
1389 case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
1390 case llvm::COFF::IMAGE_FILE_MACHINE_THUMB:
1391 case llvm::COFF::IMAGE_FILE_MACHINE_ARM64:
1395 : llvm::Triple::UnknownOS);
1403 if ((
m_coff_header.flags & llvm::COFF::IMAGE_FILE_DLL) == 0)
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.
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
static bool SaveCore(const lldb::ProcessSP &process_sp, lldb_private::SaveCoreOptions &options, lldb_private::Status &error)
bool ParseCOFFOptionalHeader(lldb::offset_t *offset_ptr)
bool IsStripped() override
Detect if this object file has been stripped of local symbols.
uint32_t ParseDependentModules()
struct ObjectFilePECOFF::coff_header coff_header_t
bool NeedsEndianSwap() const
lldb::addr_t GetFileAddress(uint32_t rva) const
struct ObjectFilePECOFF::coff_opt_header coff_opt_header_t
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)
struct ObjectFilePECOFF::dos_header dos_header_t
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.
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.
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.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
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()
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)
ObjectFile(const lldb::ModuleSP &module_sp, const FileSpec *file_spec_ptr, lldb::offset_t file_offset, lldb::offset_t length, lldb::DataBufferSP data_sp, lldb::offset_t data_offset)
Construct with a parent module, offset, and header data.
std::unique_ptr< lldb_private::Symtab > m_symtab_up
static lldb::SectionType GetDWARFSectionTypeFromName(llvm::StringRef name)
Parses the section type from a section name for DWARF sections.
@ 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)
const std::optional< lldb_private::FileSpec > GetOutputFile() const
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
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)
bool SetSectionLoadAddress(const lldb::SectionSP §ion, lldb::addr_t load_addr, bool warn_multiple=false)
Represents UUID's of various sizes.
#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, SaveCoreOptions &core_options, 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
@ eSectionTypeLLDBFormatters
@ eSectionTypeLLDBTypeSummaries
@ eSectionTypeSwiftModules
@ eSectionTypeDataCString
Inlined C string data.
std::shared_ptr< lldb_private::Module > ModuleSP
std::shared_ptr< lldb_private::OptionValue > OptionValueSP
struct lldb_private::UUID::CvRecordPdb70::@031031370151201011001273071037042037235035311007 Uuid
llvm::support::ulittle32_t Age