diff options
| author | Ed Maste <emaste@FreeBSD.org> | 2019-06-04 13:07:10 +0000 |
|---|---|---|
| committer | Ed Maste <emaste@FreeBSD.org> | 2019-06-04 13:07:10 +0000 |
| commit | 74cd06b42ea6f7b46f4782c511757bdfc038d6e8 (patch) | |
| tree | 26c0932c07f6ea0617374219c30faba9cceebd5c /sys | |
| parent | 9c954a4843b2718d0934c3a9c525263a9287bd8f (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/conf/ldscript.amd64 | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.arm | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.arm64 | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.i386 | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.mips | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.mips.cfe | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.mips.mips64 | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.mips.octeon1 | 6 | ||||
| -rw-r--r-- | sys/conf/ldscript.powerpc | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.powerpc64 | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.powerpcspe | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.riscv | 5 | ||||
| -rw-r--r-- | sys/conf/ldscript.sparc64 | 5 | ||||
| -rw-r--r-- | sys/kern/kern_mib.c | 48 |
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 |
