[Lldb-commits] [lldb] Read and store gnu build id from loaded core file (PR #92492)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri May 17 03:57:26 PDT 2024
================
@@ -983,6 +1005,73 @@ llvm::Error ProcessElfCore::ParseThreadContextsFromNoteSegment(
}
}
+bool ProcessElfCore::IsElf(const lldb::addr_t address) {
+ uint8_t buf[4];
+ Status error;
+ size_t byte_read = ReadMemory(address, buf, 4, error);
+ if (byte_read != 4)
+ return false;
+ return elf::ELFHeader::MagicBytesMatch(buf);
+}
+
+std::optional<UUID> ProcessElfCore::FindNote(const lldb::addr_t address,
+ const uint32_t type) {
+ if (!IsElf(address))
+ return std::nullopt;
+ const uint32_t addr_size = GetAddressByteSize();
+ const lldb::offset_t ehdr_phoff_offset = ELFOFFSETOF(Ehdr, e_phoff);
+ const lldb::offset_t ehdr_phentsize_offset = ELFOFFSETOF(Ehdr, e_phentsize);
+ const lldb::offset_t ehdr_phnum_offset = ELFOFFSETOF(Ehdr, e_phnum);
+ const size_t elf_header_size = addr_size == 4 ? sizeof(llvm::ELF::Elf32_Ehdr)
+ : sizeof(llvm::ELF::Elf64_Ehdr);
+
+ unsigned char buf[4096];
+ Status error;
+ size_t byte_read = ReadMemory(address, buf, elf_header_size, error);
+ DataExtractor data(buf, 4096, GetByteOrder(), addr_size);
+ lldb::offset_t offset = ehdr_phoff_offset;
+ lldb::offset_t phoff = data.GetAddress(&offset);
+
+ offset = ehdr_phentsize_offset;
+ lldb::offset_t phentsize = data.GetU16(&offset);
+ offset = ehdr_phnum_offset;
+ lldb::offset_t phnum = data.GetU16(&offset);
----------------
labath wrote:
Reuse the existing `ELFHeader` class for this. I.e., read the necessary amount of bytes (you can just always read `sizeof(Elf64_Ehdr)` as that's larger) into a DataExtractor and call `header.Parse(extractor, 0)`.
https://github.com/llvm/llvm-project/pull/92492
More information about the lldb-commits
mailing list