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/Host.h"
40#include "llvm/Support/MemoryBuffer.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 (llvm::Triple::EnvironmentType)
94 m_collection_sp->GetPropertyAtIndexAsEnumeration(
95 nullptr, ePropertyABI, llvm::Triple::UnknownEnvironment);
99 return m_collection_sp->GetPropertyAtIndexAsOptionValueDictionary(
100 nullptr, ePropertyModuleABIMap);
107 static PluginProperties g_settings;
112 std::string &gnu_debuglink_file,
114 static ConstString g_sect_name_gnu_debuglink(
".gnu_debuglink");
115 for (
const auto §ion : coff_obj.sections()) {
116 auto name = section.getName();
118 llvm::consumeError(name.takeError());
121 if (*name == g_sect_name_gnu_debuglink.
GetStringRef()) {
122 auto content = section.getContents();
124 llvm::consumeError(content.takeError());
128 content->data(), content->size(),
131 gnu_debuglink_file = data.
GetCStr(&gnu_debuglink_offset);
133 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4);
134 data.
GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
142 const llvm::codeview::DebugInfo *pdb_info =
nullptr;
143 llvm::StringRef pdb_file;
147 if (!coff_obj.getDebugPDBInfo(pdb_info, pdb_file) && pdb_info) {
148 if (pdb_info->PDB70.CVSignature == llvm::OMF::Signature::PDB70) {
150 memcpy(&info.
Uuid, pdb_info->PDB70.Signature,
sizeof(info.
Uuid));
151 info.
Age = pdb_info->PDB70.Age;
156 std::string gnu_debuglink_file;
166 auto raw_data = coff_obj.getData();
168 "Calculating module crc32 %s with size %" PRIu64
" KiB",
171 gnu_debuglink_crc = llvm::crc32(0, llvm::arrayRefFromStringRef(raw_data));
174 llvm::support::ulittle32_t data(gnu_debuglink_crc);
175 return UUID(&data,
sizeof(data));
189 debugger, PluginProperties::GetSettingName())) {
190 const bool is_global_setting =
true;
193 ConstString(
"Properties for the PE/COFF object-file plug-in."),
203 return "Portable Executable and Common Object File Format object file reader "
208 const lldb::ModuleSP &module_sp, DataBufferSP data_sp,
223 if (data_sp->GetByteSize() < length) {
229 auto objfile_up = std::make_unique<ObjectFilePECOFF>(
230 module_sp, data_sp, data_offset, file_p, file_offset, length);
231 if (!objfile_up || !objfile_up->ParseHeader())
235 if (!objfile_up->CreateBinary())
237 return objfile_up.release();
241 const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp,
242 const lldb::ProcessSP &process_sp,
lldb::addr_t header_addr) {
245 auto objfile_up = std::make_unique<ObjectFilePECOFF>(
246 module_sp, data_sp, process_sp, header_addr);
247 if (objfile_up.get() && objfile_up->ParseHeader()) {
248 return objfile_up.release();
257 const size_t initial_count = specs.
GetSize();
259 return initial_count;
263 if (data_sp->GetByteSize() < length)
264 if (DataBufferSP full_sp =
MapFileData(file, -1, file_offset))
265 data_sp = std::move(full_sp);
266 auto binary = llvm::object::createBinary(llvm::MemoryBufferRef(
271 "Failed to create binary for file ({1}): {0}", file);
272 return initial_count;
275 auto *COFFObj = llvm::dyn_cast<llvm::object::COFFObjectFile>(binary->get());
277 return initial_count;
285 static llvm::Triple::EnvironmentType default_env = [] {
286 auto def_target = llvm::Triple(
287 llvm::Triple::normalize(llvm::sys::getDefaultTargetTriple()));
288 if (def_target.getOS() == llvm::Triple::Win32 &&
289 def_target.getEnvironment() != llvm::Triple::UnknownEnvironment)
290 return def_target.getEnvironment();
291 return llvm::Triple::MSVC;
295 OptionValueSP module_env_option;
297 if (map->GetNumValues() > 0) {
300 module_env_option = map->GetValueForKey(name);
301 if (!module_env_option) {
305 map->GetValueForKey(
ConstString(llvm::StringRef(name_lower)));
307 if (!module_env_option) {
309 auto name_stripped = name.GetStringRef();
310 if (name_stripped.consume_back_insensitive(
".debug")) {
311 module_env_option = map->GetValueForKey(
ConstString(name_stripped));
312 if (!module_env_option) {
315 auto name_lower = name_stripped.lower();
317 map->GetValueForKey(
ConstString(llvm::StringRef(name_lower)));
322 llvm::Triple::EnvironmentType env;
323 if (module_env_option)
325 (llvm::Triple::EnvironmentType)module_env_option->GetEnumerationValue();
329 if (env == llvm::Triple::UnknownEnvironment)
332 switch (COFFObj->getMachine()) {
336 specs.
Append(module_spec);
341 specs.
Append(module_spec);
346 specs.
Append(module_spec);
351 specs.
Append(module_spec);
357 return specs.
GetSize() - initial_count;
378 const auto complex_type =
379 coff_symbol_type >> llvm::COFF::SCT_COMPLEX_TYPE_SHIFT;
380 if (complex_type == llvm::COFF::IMAGE_SYM_DTYPE_FUNCTION) {
383 const auto base_type = coff_symbol_type & 0xff;
384 if (base_type == llvm::COFF::IMAGE_SYM_TYPE_NULL &&
385 complex_type == llvm::COFF::IMAGE_SYM_DTYPE_NULL) {
399 auto binary = llvm::object::createBinary(llvm::MemoryBufferRef(
403 "Failed to create binary for file ({1}): {0}",
m_file);
409 llvm::unique_dyn_cast<llvm::object::COFFObjectFile>(std::move(*binary));
413 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
420 DataBufferSP data_sp,
425 :
ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
426 m_dos_header(), m_coff_header(), m_coff_header_opt(), m_sect_headers(),
431 WritableDataBufferSP header_data_sp,
432 const lldb::ProcessSP &process_sp,
434 :
ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
435 m_dos_header(), m_coff_header(), m_coff_header_opt(), m_sect_headers(),
444 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
467 bool value_is_offset) {
468 bool changed =
false;
471 size_t num_loaded_sections = 0;
474 if (!value_is_offset) {
478 const size_t num_sections = section_list->
GetSize();
481 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
485 if (section_sp && !section_sp->IsThreadSpecific()) {
487 section_sp, section_sp->GetFileAddress() + value))
488 ++num_loaded_sections;
491 changed = num_loaded_sections > 0;
516#if defined(__LITTLE_ENDIAN__)
525 bool success =
false;
602 bool success =
false;
604 if (*offset_ptr < end_offset) {
617 if (*offset_ptr < end_offset) {
624 if (*offset_ptr < end_offset) {
654 for (i = 0; i < num_data_dir_entries; i++) {
664 *offset_ptr = end_offset;
694 auto data_up = std::make_unique<DataBufferHeap>(size, 0);
697 process_sp->ReadMemory(
m_image_base + offset, data_up->GetBytes(),
698 data_up->GetByteSize(), readmem_error);
699 if (bytes_read == size) {
700 DataBufferSP buffer_sp(data_up.release());
701 data.
SetData(buffer_sp, 0, buffer_sp->GetByteSize());
712 rva = sect->GetFileOffset() + addr.
GetOffset();
719 uint32_t section_header_data_offset) {
726 ReadImageData(section_header_data_offset, section_header_byte_size);
729 if (section_header_data.ValidOffsetForDataOfSize(
730 offset, section_header_byte_size)) {
733 for (
uint32_t idx = 0; idx < nsects; ++idx) {
734 const void *name_data = section_header_data.GetData(&offset, 8);
742 m_sect_headers[idx].lineoff = section_header_data.GetU32(&offset);
755 llvm::StringRef hdr_name(sect.
name, std::size(sect.
name));
756 hdr_name = hdr_name.split(
'\0').first;
757 if (hdr_name.consume_front(
"/")) {
759 if (!to_integer(hdr_name, stroff, 10))
777 const std::pair<uint32_t, uint32_t> &b) {
778 return a.first < b.first;
788 if (
m_binary->getSymbolTableEntrySize() !=
789 sizeof(llvm::object::coff_symbol16))
794 for (
const auto &sym_ref :
m_binary->symbols()) {
795 const auto coff_sym_ref =
m_binary->getCOFFSymbol(sym_ref);
796 auto name_or_error = sym_ref.getName();
797 if (
auto err = name_or_error.takeError()) {
799 "ObjectFilePECOFF::AppendFromCOFFSymbolTable - failed to get "
800 "symbol table entry name: {0}",
801 llvm::fmt_consume(std::move(err)));
804 const llvm::StringRef sym_name = *name_or_error;
807 int16_t section_number =
808 static_cast<int16_t
>(coff_sym_ref.getSectionNumber());
809 if (section_number >= 1) {
812 const auto symbol_type =
MapSymbolType(coff_sym_ref.getType());
818 const auto &first_match = std::lower_bound(
819 sorted_exports.begin(), sorted_exports.end(),
821 for (
auto it = first_match;
822 it != sorted_exports.end() && it->first == symbol_rva; ++it) {
825 exported->
SetType(symbol_type);
841 }
else if (section_number == llvm::COFF::IMAGE_SYM_ABSOLUTE) {
852 const auto *export_table =
m_binary->getExportTable();
855 const uint32_t num_syms = export_table->AddressTableEntries;
863 for (
const auto &entry :
m_binary->export_directories()) {
864 llvm::StringRef sym_name;
865 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)));
877 llvm::cantFail(entry.getOrdinal(ordinal));
878 symbol.
SetID(ordinal);
881 llvm::cantFail(entry.isForwarder(is_forwarder));
885 llvm::StringRef forwarder_name;
886 if (
auto err = entry.getForwardTo(forwarder_name)) {
888 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
889 "forwarder name of forwarder export '{0}': {1}",
890 sym_name, llvm::fmt_consume(std::move(err)));
894 " (forwarded to ", forwarder_name,
901 if (
auto err = entry.getExportRVA(function_rva)) {
903 "ObjectFilePECOFF::AppendFromExportTable - failed to get "
904 "address of export entry '{0}': {1}",
905 sym_name, llvm::fmt_consume(std::move(err)));
909 if (function_rva == 0 && sym_name.empty())
919 if (section_sp->GetPermissions() & ePermissionsExecutable)
923 export_list.push_back(std::make_pair(function_rva, idx));
925 std::stable_sort(export_list.begin(), export_list.end(),
936 if (!data_dir_exception.
vmaddr)
942 return std::make_unique<PECallFrameInfo>(*
this, data_dir_exception.
vmaddr,
943 data_dir_exception.
vmsize);
961 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE &&
962 ((const_sect_name == g_code_sect_name) ||
963 (const_sect_name == g_CODE_sect_name))) {
966 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA &&
967 ((const_sect_name == g_data_sect_name) ||
968 (const_sect_name == g_DATA_sect_name))) {
974 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA &&
975 ((const_sect_name == g_bss_sect_name) ||
976 (const_sect_name == g_BSS_sect_name))) {
984 llvm::StringSwitch<SectionType>(sect_name)
1007 return section_type;
1009 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_CODE)
1011 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
1013 if (sect.
flags & llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) {
1028 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1030 SectionSP header_sp = std::make_shared<Section>(
1037 header_sp->SetPermissions(ePermissionsReadable);
1043 for (
uint32_t idx = 0; idx < nsects; ++idx) {
1048 SectionSP section_sp(
new Section(
1066 if (
m_sect_headers[idx].flags & llvm::COFF::IMAGE_SCN_MEM_EXECUTE)
1067 permissions |= ePermissionsExecutable;
1069 permissions |= ePermissionsReadable;
1071 permissions |= ePermissionsWritable;
1072 section_sp->SetPermissions(permissions);
1092 std::string gnu_debuglink_file;
1095 return FileSpec(gnu_debuglink_file);
1096 return std::nullopt;
1104 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1113 LLDB_LOG(log,
"this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
1119 for (
const auto &entry :
m_binary->import_directories()) {
1120 llvm::StringRef dll_name;
1122 if (llvm::Error e = entry.getName(dll_name)) {
1124 "ObjectFilePECOFF::ParseDependentModules() - failed to get "
1125 "import directory entry name: %s",
1126 llvm::toString(std::move(e)).c_str());
1133 llvm::SmallString<128> dll_fullpath;
1137 if (!llvm::sys::fs::real_path(dll_specs.
GetPath(), dll_fullpath))
1149 auto original_size = files.GetSize();
1151 for (
unsigned i = 0; i < num_modules; ++i)
1154 return files.GetSize() - original_size;
1186 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
1187 s->
Printf(
"%p: ",
static_cast<void *
>(
this));
1193 *s <<
", file = '" <<
m_file
1239 s->
Printf(
" e_res[4] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1243 s->
Printf(
" e_res2[10] = { 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, "
1244 "0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x, 0x%4.4x }\n",
1272 s->
Printf(
" major_linker_version = 0x%2.2x\n",
1274 s->
Printf(
" minor_linker_version = 0x%2.2x\n",
1282 s->
Printf(
" image_base = 0x%16.16" PRIx64
"\n",
1286 s->
Printf(
" major_os_system_version = 0x%4.4x\n",
1288 s->
Printf(
" minor_os_system_version = 0x%4.4x\n",
1290 s->
Printf(
" major_image_version = 0x%4.4x\n",
1292 s->
Printf(
" minor_image_version = 0x%4.4x\n",
1294 s->
Printf(
" major_subsystem_version = 0x%4.4x\n",
1296 s->
Printf(
" minor_subsystem_version = 0x%4.4x\n",
1304 s->
Printf(
" stack_reserve_size = 0x%16.16" PRIx64
"\n",
1306 s->
Printf(
" stack_commit_size = 0x%16.16" PRIx64
"\n",
1308 s->
Printf(
" heap_reserve_size = 0x%16.16" PRIx64
"\n",
1310 s->
Printf(
" heap_commit_size = 0x%16.16" PRIx64
"\n",
1313 s->
Printf(
" num_data_dir_entries = 0x%8.8x\n",
1316 for (i = 0; i < header.
data_dirs.size(); i++) {
1317 s->
Printf(
" data_dirs[%2u] vmaddr = 0x%8.8x, vmsize = 0x%8.8x\n", i,
1327 s->
Printf(
"%-16s 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x 0x%4.4x "
1328 "0x%4.4x 0x%8.8x\n",
1339 s->
PutCString(
"IDX name vm addr vm size file off file "
1340 "size reloc off line off nreloc nline flags\n");
1341 s->
PutCString(
"==== ---------------- ---------- ---------- ---------- "
1342 "---------- ---------- ---------- ------ ------ ----------\n");
1348 s->
Printf(
"[%2u] ", idx);
1358 if (num_modules > 0) {
1360 for (
unsigned i = 0; i < num_modules; ++i) {
1362 s->
Printf(
" %s\n", spec.GetFilename().GetCString());
1369 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE:
1370 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI:
1371 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI:
1372 case llvm::COFF::IMAGE_SUBSYSTEM_NATIVE_WINDOWS:
1373 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
1374 case llvm::COFF::IMAGE_SUBSYSTEM_XBOX:
1375 case llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION:
1387 case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
1388 case llvm::COFF::IMAGE_FILE_MACHINE_I386:
1389 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPC:
1390 case llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP:
1391 case llvm::COFF::IMAGE_FILE_MACHINE_ARM:
1392 case llvm::COFF::IMAGE_FILE_MACHINE_ARMNT:
1393 case llvm::COFF::IMAGE_FILE_MACHINE_THUMB:
1394 case llvm::COFF::IMAGE_FILE_MACHINE_ARM64:
1398 : 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
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.
void SetDirectory(ConstString directory)
Directory string set accessor.
const ConstString & GetFilename() const
Filename string const get accessor.
ConstString GetLastPathComponent() const
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.
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, ConstString 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