================ @@ -983,6 +1001,66 @@ llvm::Error ProcessElfCore::ParseThreadContextsFromNoteSegment( } } +bool ProcessElfCore::IsElf(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::FindNoteInCoreMemory(lldb::addr_t address, + uint32_t type) { + if (!IsElf(address)) + return std::nullopt; + const uint32_t addr_size = GetAddressByteSize(); + 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); + if (byte_read != elf_header_size) + return std::nullopt; + DataExtractor data(buf, 4096, GetByteOrder(), addr_size); + lldb::offset_t offset = 0; + + elf::ELFHeader elf_header; + elf_header.Parse(data, &offset); + + const lldb::addr_t ph_addr = address + elf_header.e_phoff; + + for (unsigned int i = 0; i < elf_header.e_phnum; ++i) { + byte_read = ReadMemory(ph_addr + i * elf_header.e_phentsize, buf, + elf_header.e_phentsize, error); + if (byte_read != elf_header.e_phentsize) + break; + offset = 0; + elf::ELFProgramHeader program_header; + program_header.Parse(data, &offset); ---------------- clayborg wrote:
Create a `DataExtractor` that contains only a program header worth of data: ``` assert(sizeof(buf) >= elf_header.e_phentsize); DataExtractor phdr_data(buf, elf_header.e_phentsize, GetByteOrder(), addr_size); program_header.Parse(phdr_data, &offset); ``` https://github.com/llvm/llvm-project/pull/92492 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits