From d14dcce504313bc1f5592d3fd98fb436bf399ff7 Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Mon, 22 May 2023 12:44:52 -0400 Subject: [PATCH] Implement reading Build ID from Go ELF binaries --- src/elf.rs | 10 ++++++++++ src/read/elf/file.rs | 10 ++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/elf.rs b/src/elf.rs index 45e9785e..da68ec2d 100644 --- a/src/elf.rs +++ b/src/elf.rs @@ -1835,6 +1835,10 @@ pub const NT_SOLARIS_PAGESIZE_HINT: u32 = 1; /// GNU entries in the note section have this name. pub const ELF_NOTE_GNU: &[u8] = b"GNU"; +/// Go entries in the note section have this name. +// See https://go-review.googlesource.com/9520 and https://go-review.googlesource.com/10704. +pub const ELF_NOTE_GO: &[u8] = b"Go"; + // Note types for `ELF_NOTE_GNU`. /// ABI information. @@ -1870,6 +1874,12 @@ pub const NT_GNU_HWCAP: u32 = 2; /// The descriptor consists of any nonzero number of bytes. pub const NT_GNU_BUILD_ID: u32 = 3; +/// Build ID bits as generated by Go's gc compiler. +/// +/// The descriptor consists of any nonzero number of bytes. +// See https://go-review.googlesource.com/10707. +pub const NT_GO_BUILD_ID: u32 = 4; + /// Version note generated by GNU gold containing a version string. pub const NT_GNU_GOLD_VERSION: u32 = 4; diff --git a/src/read/elf/file.rs b/src/read/elf/file.rs index 940fea51..23433904 100644 --- a/src/read/elf/file.rs +++ b/src/read/elf/file.rs @@ -379,10 +379,12 @@ where let mut notes = self.notes(); while let Some(mut notes) = notes.next().transpose()? { while let Some(note) = notes.next()? { - if note.name() == elf::ELF_NOTE_GNU - && note.n_type(self.endian) == elf::NT_GNU_BUILD_ID - { - return Ok(Some(note.desc())); + match (note.name(), note.n_type(self.endian())) { + (elf::ELF_NOTE_GNU, elf::NT_GNU_BUILD_ID) + | (elf::ELF_NOTE_GO, elf::NT_GO_BUILD_ID) => { + return Ok(Some(note.desc())); + } + _ => {} } } }