Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F146671953
D20326.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
9 KB
Referenced Files
None
Subscribers
None
D20326.diff
View Options
Index: head/sys/conf/ldscript.amd64
===================================================================
--- head/sys/conf/ldscript.amd64
+++ head/sys/conf/ldscript.amd64
@@ -74,6 +74,11 @@
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.eh_frame_hdr : { *(.eh_frame_hdr) }
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
Index: head/sys/conf/ldscript.arm
===================================================================
--- head/sys/conf/ldscript.arm
+++ head/sys/conf/ldscript.arm
@@ -27,6 +27,11 @@
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.rel.text :
{ *(.rel.text) *(.rel.gnu.linkonce.t*) }
.rela.text :
Index: head/sys/conf/ldscript.arm64
===================================================================
--- head/sys/conf/ldscript.arm64
+++ head/sys/conf/ldscript.arm64
@@ -27,6 +27,11 @@
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.rel.text :
{ *(.rel.text) *(.rel.gnu.linkonce.t*) }
.rela.text :
Index: head/sys/conf/ldscript.i386
===================================================================
--- head/sys/conf/ldscript.i386
+++ head/sys/conf/ldscript.i386
@@ -62,6 +62,11 @@
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.eh_frame_hdr : { *(.eh_frame_hdr) }
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
Index: head/sys/conf/ldscript.mips
===================================================================
--- head/sys/conf/ldscript.mips
+++ head/sys/conf/ldscript.mips
@@ -63,6 +63,11 @@
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.rel.init : { *(.rel.init) }
.rela.init : { *(.rela.init) }
.rel.text :
Index: head/sys/conf/ldscript.mips.cfe
===================================================================
--- head/sys/conf/ldscript.mips.cfe
+++ head/sys/conf/ldscript.mips.cfe
@@ -192,6 +192,11 @@
PROVIDE (etext = .);
.rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.reginfo : { *(.reginfo) }
.sdata2 : { *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) }
.sbss2 : { *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) }
Index: head/sys/conf/ldscript.mips.mips64
===================================================================
--- head/sys/conf/ldscript.mips.mips64
+++ head/sys/conf/ldscript.mips.mips64
@@ -176,6 +176,11 @@
PROVIDE (etext = .);
.rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.reginfo : { *(.reginfo) }
.sdata2 : { *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) }
.sbss2 : { *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) }
Index: head/sys/conf/ldscript.mips.octeon1
===================================================================
--- head/sys/conf/ldscript.mips.octeon1
+++ head/sys/conf/ldscript.mips.octeon1
@@ -23,6 +23,12 @@
*(.rodata)
. = ALIGN(32);
}
+
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.data : {
_rwdata = .;
Index: head/sys/conf/ldscript.powerpc
===================================================================
--- head/sys/conf/ldscript.powerpc
+++ head/sys/conf/ldscript.powerpc
@@ -55,6 +55,11 @@
.fini : { *(.fini) } =0
.rodata : { *(.rodata) *(.gnu.linkonce.r*) }
.rodata1 : { *(.rodata1) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.sdata2 : { *(.sdata2) }
.sbss2 : { *(.sbss2) }
/* Adjust the address for the data segment to the next page up. */
Index: head/sys/conf/ldscript.powerpc64
===================================================================
--- head/sys/conf/ldscript.powerpc64
+++ head/sys/conf/ldscript.powerpc64
@@ -46,6 +46,11 @@
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.rela.text :
{ *(.rela.text) *(.rela.gnu.linkonce.t*) }
.rela.data :
Index: head/sys/conf/ldscript.powerpcspe
===================================================================
--- head/sys/conf/ldscript.powerpcspe
+++ head/sys/conf/ldscript.powerpcspe
@@ -55,6 +55,11 @@
.fini : { *(.fini) } =0
.rodata : { *(.rodata) *(.gnu.linkonce.r*) }
.rodata1 : { *(.rodata1) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.sdata2 : { *(.sdata2) }
.sbss2 : { *(.sbss2) }
/* Adjust the address for the data segment to the next page up. */
Index: head/sys/conf/ldscript.riscv
===================================================================
--- head/sys/conf/ldscript.riscv
+++ head/sys/conf/ldscript.riscv
@@ -27,6 +27,11 @@
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.rel.text :
{ *(.rel.text) *(.rel.gnu.linkonce.t*) }
.rela.text :
Index: head/sys/conf/ldscript.sparc64
===================================================================
--- head/sys/conf/ldscript.sparc64
+++ head/sys/conf/ldscript.sparc64
@@ -146,6 +146,11 @@
PROVIDE (etext = .);
.rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.sdata2 : { *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) }
.sbss2 : { *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) }
. = ALIGN(0x2000) + (. & (0x2000 - 1));
Index: head/sys/kern/kern_mib.c
===================================================================
--- head/sys/kern/kern_mib.c
+++ head/sys/kern/kern_mib.c
@@ -481,6 +481,54 @@
CTLTYPE_INT | CTLFLAG_CAPRD | CTLFLAG_RD | CTLFLAG_MPSAFE,
NULL, 0, sysctl_osreldate, "I", "Kernel release date");
+/*
+ * The build-id is copied from the ELF section .note.gnu.build-id. The linker
+ * script defines two variables to expose the beginning and end. LLVM
+ * currently uses a SHA-1 hash, but other formats can be supported by checking
+ * the length of the section.
+ */
+
+extern char __build_id_start[];
+extern char __build_id_end[];
+
+#define BUILD_ID_HEADER_LEN 0x10
+#define BUILD_ID_HASH_MAXLEN 0x14
+
+static int
+sysctl_build_id(SYSCTL_HANDLER_ARGS)
+{
+ uintptr_t sectionlen = (uintptr_t)(__build_id_end - __build_id_start);
+ int hashlen;
+ char buf[2*BUILD_ID_HASH_MAXLEN+1];
+
+ /*
+ * The ELF note section has a four byte length for the vendor name,
+ * four byte length for the value, and a four byte vendor specific
+ * type. The name for the build id is "GNU\0". We skip the first 16
+ * bytes to read the build hash. We will return the remaining bytes up
+ * to 20 (SHA-1) hash size. If the hash happens to be a custom number
+ * of bytes we will pad the value with zeros, as the section should be
+ * four byte aligned.
+ */
+ if (sectionlen <= BUILD_ID_HEADER_LEN ||
+ sectionlen > (BUILD_ID_HEADER_LEN + BUILD_ID_HASH_MAXLEN)) {
+ return (ENOENT);
+ }
+
+
+ hashlen = sectionlen - BUILD_ID_HEADER_LEN;
+ for (int i = 0; i < hashlen; i++) {
+ uint8_t c = __build_id_start[i+BUILD_ID_HEADER_LEN];
+ snprintf(&buf[2*i], 3, "%02x", c);
+ }
+
+ return (SYSCTL_OUT(req, buf, strlen(buf) + 1));
+}
+
+SYSCTL_PROC(_kern, OID_AUTO, build_id,
+ CTLTYPE_STRING | CTLFLAG_CAPRD | CTLFLAG_RD | CTLFLAG_MPSAFE,
+ NULL, 0, sysctl_build_id, "A", "Operating system build-id");
+
SYSCTL_NODE(_kern, OID_AUTO, features, CTLFLAG_RD, 0, "Kernel Features");
#ifdef COMPAT_FREEBSD4
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Mar 5, 2:42 PM (4 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29288645
Default Alt Text
D20326.diff (9 KB)
Attached To
Mode
D20326: Expose the buildid hash through sysctl
Attached
Detach File
Event Timeline
Log In to Comment