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);
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) {
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(
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),
425 m_dos_header(), m_coff_header(), m_coff_header_opt(), m_sect_headers(),
433 :
ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
434 m_dos_header(), m_coff_header(), m_coff_header_opt(), m_sect_headers(),
443 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
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;
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) {
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;
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))
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)) {
867 "ObjectFilePECOFF::AppendFromExportTable - failed to get export "
868 "table entry name: {0}",
869 llvm::fmt_consume(std::move(err)));
871 llvm::consumeError(std::move(err));
879 llvm::cantFail(entry.getOrdinal(ordinal));
880 symbol.
SetID(ordinal);
883 llvm::cantFail(entry.isForwarder(is_forwarder));
887 llvm::StringRef forwarder_name;
888 if (
auto err = entry.getForwardTo(forwarder_name)) {
890 log->
Format(__FILE__, __func__,
891 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
892 "forwarder name of forwarder export '{0}': {1}",
893 sym_name, llvm::fmt_consume(std::move(err)));
895 llvm::consumeError(std::move(err));
899 " (forwarded to ", forwarder_name,
905 uint32_t function_rva;
906 if (
auto err = entry.getExportRVA(function_rva)) {
908 log->
Format(__FILE__, __func__,
909 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
910 "address of export entry '{0}': {1}",
911 sym_name, llvm::fmt_consume(std::move(err)));
913 llvm::consumeError(std::move(err));
917 if (function_rva == 0 && sym_name.empty())
927 if (section_sp->GetPermissions() & ePermissionsExecutable)
931 export_list.push_back(std::make_pair(function_rva, idx));
933 std::stable_sort(export_list.begin(), export_list.end(),
944 if (!data_dir_exception.
vmaddr)
950 return std::make_unique<PECallFrameInfo>(*
this, data_dir_exception.
vmaddr,
951 data_dir_exception.
vmsize);
969 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE &&
970 ((const_sect_name == g_code_sect_name) ||
971 (const_sect_name == g_CODE_sect_name))) {
974 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA &&
975 ((const_sect_name == g_data_sect_name) ||
976 (const_sect_name == g_DATA_sect_name))) {
982 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA &&
983 ((const_sect_name == g_bss_sect_name) ||
984 (const_sect_name == g_BSS_sect_name))) {
992 llvm::StringSwitch<SectionType>(sect_name)
1018 return section_type;
1020 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE)
1022 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
1024 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) {
1049 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1051 SectionSP header_sp = std::make_shared<Section>(
1058 header_sp->SetPermissions(ePermissionsReadable);
1063 for (uint32_t idx = 0; idx < nsects; ++idx) {
1085 uint32_t permissions = 0;
1086 if (
m_sect_headers[idx].flags & llvm::COFF::IMAGE_SCN_MEM_EXECUTE)
1087 permissions |= ePermissionsExecutable;
1089 permissions |= ePermissionsReadable;
1091 permissions |= ePermissionsWritable;
1092 section_sp->SetPermissions(permissions);
1112 std::string gnu_debuglink_file;
1113 uint32_t gnu_debuglink_crc;
1115 return FileSpec(gnu_debuglink_file);
1116 return std::nullopt;
1124 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1133 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
1139 for (
const auto &entry :
m_binary->import_directories()) {
1140 llvm::StringRef dll_name;
1142 if (llvm::Error e = entry.getName(dll_name)) {
1144 "ObjectFilePECOFF::ParseDependentModules() - failed to get "
1145 "import directory entry name: %s",
1146 llvm::toString(std::move(e)).c_str());
1153 llvm::SmallString<128> dll_fullpath;
1157 if (!llvm::sys::fs::real_path(dll_specs.
GetPath(), dll_fullpath))
1169 auto original_size = files.
GetSize();
1171 for (
unsigned i = 0; i < num_modules; ++i)
1174 return files.
GetSize() - original_size;
1206 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1207 s->
Printf(
"%p: ",
static_cast<void *
>(
this));
1213 *s <<
", file = '" <<
m_file
1259 s->
Printf(
" e_res[4] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1263 s->
Printf(
" e_res2[10] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, "
1264 "0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1292 s->
Printf(
" major_linker_version = 0x%2.2x\n",
1294 s->
Printf(
" minor_linker_version = 0x%2.2x\n",
1302 s->
Printf(
" image_base = 0x%16.16" PRIx64
"\n",
1306 s->
Printf(
" major_os_system_version = 0x%4.4x\n",
1308 s->
Printf(
" minor_os_system_version = 0x%4.4x\n",
1310 s->
Printf(
" major_image_version = 0x%4.4x\n",
1312 s->
Printf(
" minor_image_version = 0x%4.4x\n",
1314 s->
Printf(
" major_subsystem_version = 0x%4.4x\n",
1316 s->
Printf(
" minor_subsystem_version = 0x%4.4x\n",
1324 s->
Printf(
" stack_reserve_size = 0x%16.16" PRIx64
"\n",
1326 s->
Printf(
" stack_commit_size = 0x%16.16" PRIx64
"\n",
1328 s->
Printf(
" heap_reserve_size = 0x%16.16" PRIx64
"\n",
1330 s->
Printf(
" heap_commit_size = 0x%16.16" PRIx64
"\n",
1333 s->
Printf(
" num_data_dir_entries = 0x%8.8x\n",
1336 for (i = 0; i < header.
data_dirs.size(); i++) {
1337 s->
Printf(
" data_dirs[%2u] vmaddr = 0x%8.8x, vmsize = 0x%8.8x\n", i,
1347 s->
Printf(
"%-16s 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%4.4x "
1348 "0x%4.4x 0x%8.8x\n",
1359 s->
PutCString(
"IDX name vm addr vm size file off file "
1360 "size reloc off line off nreloc nline flags\n");
1361 s->
PutCString(
"==== ---------------- ---------- ---------- ---------- "
1362 "---------- ---------- ---------- ------ ------ ----------\n");
1368 s->
Printf(
"[%2u] ", idx);
1378 if (num_modules > 0) {
1380 for (
unsigned i = 0; i < num_modules; ++i) {
1382 s->
Printf(
" %s\n", spec.GetFilename().GetCString());
1389 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE:
1390 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI:
1391 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI:
1392 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE_WINDOWS:
1393 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
1394 case llvm::COFF::IMAGE_SUBSYSTEM_XBOX:
1395 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION:
1407 case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
1408 case llvm::COFF::IMAGE_FILE_MACHINE_I386:
1409 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPC:
1410 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP:
1411 case llvm::COFF::IMAGE_FILE_MACHINE_ARM:
1412 case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
1413 case llvm::COFF::IMAGE_FILE_MACHINE_THUMB:
1414 case llvm::COFF::IMAGE_FILE_MACHINE_ARM64:
1418 : 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.
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()
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)
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
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, 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
@ eSectionTypeDWARFDebugPubNames
@ eSectionTypeDWARFDebugFrame
@ eSectionTypeDWARFDebugLocLists
DWARF v5 .debug_loclists.
@ eSectionTypeDWARFDebugTypes
DWARF .debug_types section.
@ eSectionTypeDWARFDebugMacInfo
@ eSectionTypeLLDBFormatters
@ eSectionTypeDWARFDebugNames
DWARF v5 .debug_names.
@ eSectionTypeDWARFDebugInfo
@ eSectionTypeDWARFDebugRanges
@ eSectionTypeLLDBTypeSummaries
@ 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::@41 Uuid
llvm::support::ulittle32_t Age