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;
369 uint16_t magic = data.
GetU16(&offset);
376 const auto complex_type =
377 coff_symbol_type >> llvm::COFF::SCT_COMPLEX_TYPE_SHIFT;
378 if (complex_type == llvm::COFF::IMAGE_SYM_DTYPE_FUNCTION) {
381 const auto base_type = coff_symbol_type & 0xff;
382 if (base_type == llvm::COFF::IMAGE_SYM_TYPE_NULL &&
383 complex_type == llvm::COFF::IMAGE_SYM_DTYPE_NULL) {
397 auto binary = llvm::object::createBinary(llvm::MemoryBufferRef(
401 "Failed to create binary for file ({1}): {0}",
m_file);
407 llvm::unique_dyn_cast<llvm::object::COFFObjectFile>(std::move(*binary));
411 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
423 :
ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
424 m_dos_header(), m_coff_header(), m_coff_header_opt(), m_sect_headers(),
432 :
ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
433 m_dos_header(), m_coff_header(), m_coff_header_opt(), m_sect_headers(),
442 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
465 bool value_is_offset) {
466 bool changed =
false;
469 size_t num_loaded_sections = 0;
472 if (!value_is_offset) {
476 const size_t num_sections = section_list->
GetSize();
479 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
483 if (section_sp && !section_sp->IsThreadSpecific()) {
485 section_sp, section_sp->GetFileAddress() + value))
486 ++num_loaded_sections;
489 changed = num_loaded_sections > 0;
514#if defined(__LITTLE_ENDIAN__)
523 bool success =
false;
600 bool success =
false;
602 if (*offset_ptr < end_offset) {
615 if (*offset_ptr < end_offset) {
622 if (*offset_ptr < end_offset) {
648 uint32_t num_data_dir_entries =
m_data.
GetU32(offset_ptr);
652 for (i = 0; i < num_data_dir_entries; i++) {
662 *offset_ptr = end_offset;
692 auto data_up = std::make_unique<DataBufferHeap>(size, 0);
695 process_sp->ReadMemory(
m_image_base + offset, data_up->GetBytes(),
696 data_up->GetByteSize(), readmem_error);
697 if (bytes_read == size) {
699 data.
SetData(buffer_sp, 0, buffer_sp->GetByteSize());
710 rva = sect->GetFileOffset() + addr.
GetOffset();
717 uint32_t section_header_data_offset) {
724 ReadImageData(section_header_data_offset, section_header_byte_size);
727 if (section_header_data.ValidOffsetForDataOfSize(
728 offset, section_header_byte_size)) {
731 for (uint32_t idx = 0; idx < nsects; ++idx) {
732 const void *name_data = section_header_data.GetData(&offset, 8);
740 m_sect_headers[idx].lineoff = section_header_data.GetU32(&offset);
753 llvm::StringRef hdr_name(sect.
name, std::size(sect.
name));
754 hdr_name = hdr_name.split(
'\0').first;
755 if (hdr_name.consume_front(
"/")) {
757 if (!to_integer(hdr_name, stroff, 10))
775 const std::pair<uint32_t, uint32_t> &b) {
776 return a.first < b.first;
782 const uint32_t num_syms =
m_binary->getNumberOfSymbols();
786 if (
m_binary->getSymbolTableEntrySize() !=
787 sizeof(llvm::object::coff_symbol16))
792 for (
const auto &sym_ref :
m_binary->symbols()) {
793 const auto coff_sym_ref =
m_binary->getCOFFSymbol(sym_ref);
794 auto name_or_error = sym_ref.getName();
795 if (!name_or_error) {
797 "ObjectFilePECOFF::AppendFromCOFFSymbolTable - failed to "
798 "get symbol table entry name: {0}");
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,
904 uint32_t function_rva;
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)
1015 return section_type;
1017 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE)
1019 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
1021 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) {
1046 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1048 SectionSP header_sp = std::make_shared<Section>(
1055 header_sp->SetPermissions(ePermissionsReadable);
1060 for (uint32_t idx = 0; idx < nsects; ++idx) {
1082 uint32_t permissions = 0;
1083 if (
m_sect_headers[idx].flags & llvm::COFF::IMAGE_SCN_MEM_EXECUTE)
1084 permissions |= ePermissionsExecutable;
1086 permissions |= ePermissionsReadable;
1088 permissions |= ePermissionsWritable;
1089 section_sp->SetPermissions(permissions);
1109 std::string gnu_debuglink_file;
1110 uint32_t gnu_debuglink_crc;
1112 return FileSpec(gnu_debuglink_file);
1113 return std::nullopt;
1121 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1130 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
1136 for (
const auto &entry :
m_binary->import_directories()) {
1137 llvm::StringRef dll_name;
1139 if (llvm::Error e = entry.getName(dll_name)) {
1141 "ObjectFilePECOFF::ParseDependentModules() - failed to get "
1142 "import directory entry name: %s",
1143 llvm::toString(std::move(e)).c_str());
1150 llvm::SmallString<128> dll_fullpath;
1154 if (!llvm::sys::fs::real_path(dll_specs.
GetPath(), dll_fullpath))
1166 auto original_size = files.
GetSize();
1168 for (
unsigned i = 0; i < num_modules; ++i)
1171 return files.
GetSize() - original_size;
1203 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1204 s->
Printf(
"%p: ",
static_cast<void *
>(
this));
1210 *s <<
", file = '" <<
m_file
1256 s->
Printf(
" e_res[4] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1260 s->
Printf(
" e_res2[10] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, "
1261 "0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1289 s->
Printf(
" major_linker_version = 0x%2.2x\n",
1291 s->
Printf(
" minor_linker_version = 0x%2.2x\n",
1299 s->
Printf(
" image_base = 0x%16.16" PRIx64
"\n",
1303 s->
Printf(
" major_os_system_version = 0x%4.4x\n",
1305 s->
Printf(
" minor_os_system_version = 0x%4.4x\n",
1307 s->
Printf(
" major_image_version = 0x%4.4x\n",
1309 s->
Printf(
" minor_image_version = 0x%4.4x\n",
1311 s->
Printf(
" major_subsystem_version = 0x%4.4x\n",
1313 s->
Printf(
" minor_subsystem_version = 0x%4.4x\n",
1321 s->
Printf(
" stack_reserve_size = 0x%16.16" PRIx64
"\n",
1323 s->
Printf(
" stack_commit_size = 0x%16.16" PRIx64
"\n",
1325 s->
Printf(
" heap_reserve_size = 0x%16.16" PRIx64
"\n",
1327 s->
Printf(
" heap_commit_size = 0x%16.16" PRIx64
"\n",
1330 s->
Printf(
" num_data_dir_entries = 0x%8.8x\n",
1333 for (i = 0; i < header.
data_dirs.size(); i++) {
1334 s->
Printf(
" data_dirs[%2u] vmaddr = 0x%8.8x, vmsize = 0x%8.8x\n", i,
1344 s->
Printf(
"%-16s 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%4.4x "
1345 "0x%4.4x 0x%8.8x\n",
1356 s->
PutCString(
"IDX name vm addr vm size file off file "
1357 "size reloc off line off nreloc nline flags\n");
1358 s->
PutCString(
"==== ---------------- ---------- ---------- ---------- "
1359 "---------- ---------- ---------- ------ ------ ----------\n");
1365 s->
Printf(
"[%2u] ", idx);
1375 if (num_modules > 0) {
1377 for (
unsigned i = 0; i < num_modules; ++i) {
1379 s->
Printf(
" %s\n", spec.GetFilename().GetCString());
1386 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE:
1387 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI:
1388 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI:
1389 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE_WINDOWS:
1390 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
1391 case llvm::COFF::IMAGE_SUBSYSTEM_XBOX:
1392 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION:
1404 case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
1405 case llvm::COFF::IMAGE_FILE_MACHINE_I386:
1406 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPC:
1407 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP:
1408 case llvm::COFF::IMAGE_FILE_MACHINE_ARM:
1409 case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
1410 case llvm::COFF::IMAGE_FILE_MACHINE_THUMB:
1411 case llvm::COFF::IMAGE_FILE_MACHINE_ARM64:
1415 : 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
@ 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::@41 Uuid
llvm::support::ulittle32_t Age