aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2019-06-04 13:07:10 +0000
committerEd Maste <emaste@FreeBSD.org>2019-06-04 13:07:10 +0000
commit74cd06b42ea6f7b46f4782c511757bdfc038d6e8 (patch)
tree26c0932c07f6ea0617374219c30faba9cceebd5c /sys
parent9c954a4843b2718d0934c3a9c525263a9287bd8f (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/conf/ldscript.amd645
-rw-r--r--sys/conf/ldscript.arm5
-rw-r--r--sys/conf/ldscript.arm645
-rw-r--r--sys/conf/ldscript.i3865
-rw-r--r--sys/conf/ldscript.mips5
-rw-r--r--sys/conf/ldscript.mips.cfe5
-rw-r--r--sys/conf/ldscript.mips.mips645
-rw-r--r--sys/conf/ldscript.mips.octeon16
-rw-r--r--sys/conf/ldscript.powerpc5
-rw-r--r--sys/conf/ldscript.powerpc645
-rw-r--r--sys/conf/ldscript.powerpcspe5
-rw-r--r--sys/conf/ldscript.riscv5
-rw-r--r--sys/conf/ldscript.sparc645
-rw-r--r--sys/kern/kern_mib.c48
14 files changed, 114 insertions, 0 deletions
diff --git a/sys/conf/ldscript.amd64 b/sys/conf/ldscript.amd64
index ca6a5a776d3e8..91088722b2e4a 100644
--- a/sys/conf/ldscript.amd64
+++ b/sys/conf/ldscript.amd64
@@ -74,6 +74,11 @@ SECTIONS
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.*) }
diff --git a/sys/conf/ldscript.arm b/sys/conf/ldscript.arm
index 47535cc735dfe..c6e801e875f23 100644
--- a/sys/conf/ldscript.arm
+++ b/sys/conf/ldscript.arm
@@ -27,6 +27,11 @@ SECTIONS
.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 :
diff --git a/sys/conf/ldscript.arm64 b/sys/conf/ldscript.arm64
index ffa582d65197f..ae99e4968f340 100644
--- a/sys/conf/ldscript.arm64
+++ b/sys/conf/ldscript.arm64
@@ -27,6 +27,11 @@ SECTIONS
.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 :
diff --git a/sys/conf/ldscript.i386 b/sys/conf/ldscript.i386
index e5d0f0cf5f43f..edff3e6d6d836 100644
--- a/sys/conf/ldscript.i386
+++ b/sys/conf/ldscript.i386
@@ -62,6 +62,11 @@ SECTIONS
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.*) }
diff --git a/sys/conf/ldscript.mips b/sys/conf/ldscript.mips
index be50c3c2f638a..5fb902c601d62 100644
--- a/sys/conf/ldscript.mips
+++ b/sys/conf/ldscript.mips
@@ -63,6 +63,11 @@ SECTIONS
.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 :
diff --git a/sys/conf/ldscript.mips.cfe b/sys/conf/ldscript.mips.cfe
index 34de41c7b41ec..48ed30ca68cca 100644
--- a/sys/conf/ldscript.mips.cfe
+++ b/sys/conf/ldscript.mips.cfe
@@ -192,6 +192,11 @@ SECTIONS
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.*) }
diff --git a/sys/conf/ldscript.mips.mips64 b/sys/conf/ldscript.mips.mips64
index 7caffb6ea9ce7..fcb03a74933bc 100644
--- a/sys/conf/ldscript.mips.mips64
+++ b/sys/conf/ldscript.mips.mips64
@@ -176,6 +176,11 @@ SECTIONS
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.*) }
diff --git a/sys/conf/ldscript.mips.octeon1 b/sys/conf/ldscript.mips.octeon1
index e8f23b04dd744..b787fe97bba5e 100644
--- a/sys/conf/ldscript.mips.octeon1
+++ b/sys/conf/ldscript.mips.octeon1
@@ -23,6 +23,12 @@ SECTIONS {
*(.rodata)
. = ALIGN(32);
}
+
+ .note.gnu.build-id : {
+ PROVIDE (__build_id_start = .);
+ *(.note.gnu.build-id)
+ PROVIDE (__build_id_end = .);
+ }
.data : {
_rwdata = .;
diff --git a/sys/conf/ldscript.powerpc b/sys/conf/ldscript.powerpc
index 5e981fdbd8d7c..3792d6ca031b2 100644
--- a/sys/conf/ldscript.powerpc
+++ b/sys/conf/ldscript.powerpc
@@ -55,6 +55,11 @@ SECTIONS
.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. */
diff --git a/sys/conf/ldscript.powerpc64 b/sys/conf/ldscript.powerpc64
index f30f09746578a..63f93259ae057 100644
--- a/sys/conf/ldscript.powerpc64
+++ b/sys/conf/ldscript.powerpc64
@@ -46,6 +46,11 @@ SECTIONS
.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 :
diff --git a/sys/conf/ldscript.powerpcspe b/sys/conf/ldscript.powerpcspe
index b190dc193b021..2625222cebb83 100644
--- a/sys/conf/ldscript.powerpcspe
+++ b/sys/conf/ldscript.powerpcspe
@@ -55,6 +55,11 @@ SECTIONS
.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. */
diff --git a/sys/conf/ldscript.riscv b/sys/conf/ldscript.riscv
index 3665b1058279f..6fbdd9ad507f1 100644
--- a/sys/conf/ldscript.riscv
+++ b/sys/conf/ldscript.riscv
@@ -27,6 +27,11 @@ SECTIONS
.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 :
diff --git a/sys/conf/ldscript.sparc64 b/sys/conf/ldscript.sparc64
index 2c4f4be7e815c..aec138ed295fd 100644
--- a/sys/conf/ldscript.sparc64
+++ b/sys/conf/ldscript.sparc64
@@ -146,6 +146,11 @@ SECTIONS
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));
diff --git a/sys/kern/kern_mib.c b/sys/kern/kern_mib.c
index cabbc0c3a205b..d5fbe820f9b45 100644
--- a/sys/kern/kern_mib.c
+++ b/sys/kern/kern_mib.c
@@ -481,6 +481,54 @@ SYSCTL_PROC(_kern, KERN_OSRELDATE, osreldate,
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