================ @@ -983,6 +995,44 @@ llvm::Error ProcessElfCore::ParseThreadContextsFromNoteSegment( } } +bool ProcessElfCore::IsElf(const NT_FILE_Entry entry) { + const uint8_t elf_header[4] = {0x7f, 0x45, 0x4c, + 0x46}; // ELF file begin with this 4 bytes + uint8_t buf[4]; + Status error; + size_t byte_read = ReadMemory(entry.start, buf, 4, error); + if (byte_read == 4) { + return memcmp(elf_header, buf, 4) == 0; + } else { + return false; + } +} + +UUID ProcessElfCore::FindBuildId(const NT_FILE_Entry entry) { + if (!IsElf(entry)) { + return UUID(); + } + // Build ID is stored in the ELF file as a section named ".note.gnu.build-id" + uint8_t gnu_build_id_bytes[8] = {0x03, 0x00, 0x00, 0x00, + 0x47, 0x4e, 0x55, 0x00}; + lldb::addr_t gnu_build_id_addr = + FastSearch(entry.start, entry.end, gnu_build_id_bytes, 8); + if (gnu_build_id_addr == LLDB_INVALID_ADDRESS) { + return UUID(); + } + uint8_t buf[36]; + Status error; + size_t byte_read = ReadMemory(gnu_build_id_addr - 8, buf, 36, error); + // .note.gnu.build-id starts with 04 00 00 00 {id_byte_size} 00 00 00 03 00 00 + // 00 47 4e 55 00 + if (byte_read == 36) { + if (buf[0] == 0x04) { + return UUID(llvm::ArrayRef<uint8_t>(buf + 16, buf[4] /*byte size*/)); + } + } ---------------- clayborg wrote:
remove braces per llvm coding guidelines for single statement `if` https://github.com/llvm/llvm-project/pull/92078 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits