Adding CONFIG_BUILDID_H option that forces build to generate file with GNU build id value: include/linux/buildid.h It contains following macros: #define LINUX_BUILDID_DATA "\x6c\x41\x0f\xea\xa9\x5d ... #define LINUX_BUILDID_SIZE 20 Those macros will be used in following patches to identify kernel in more precise way when loading eBPF program that can touch kernel internal structures. There's new build output for the check and update of the buildid.h: $ make ... LD vmlinux.o MODPOST vmlinux.o KSYM .tmp_kallsyms1.o KSYM .tmp_kallsyms2.o LD vmlinux SORTEX vmlinux SYSMAP System.map CHK include/generated/uapi/linux/buildid.h UPD include/generated/uapi/linux/buildid.h ... Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> --- Makefile | 12 ++++++++++++ init/Kconfig | 3 +++ scripts/Makefile | 1 + scripts/extract-buildid.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 scripts/extract-buildid.c diff --git a/Makefile b/Makefile index a65a3919c6ad..92b04d8f08bc 100644 --- a/Makefile +++ b/Makefile @@ -1023,6 +1023,15 @@ endif include/generated/autoksyms.h: FORCE $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh true +ifdef CONFIG_BUILDID_H +buildid_h := include/linux/buildid.h + +define filechk_buildid.h + buildid=`readelf -n $@ | grep 'Build ID' | sed -e 's/^.*Build ID: \(.*\)$$/\1/'`; \ + scripts/extract-buildid $$buildid +endef +endif + ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink) # Final link of vmlinux with optional arch pass after final link @@ -1032,6 +1041,9 @@ cmd_link-vmlinux = \ vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE +$(call if_changed,link-vmlinux) +ifdef CONFIG_BUILDID_H + +$(call filechk2,buildid.h,$(buildid_h)) +endif # Build samples along the rest of the kernel ifdef CONFIG_SAMPLES diff --git a/init/Kconfig b/init/Kconfig index 2852692d7c9c..572df24dda9b 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1386,6 +1386,9 @@ config KALLSYMS_BASE_RELATIVE # end of the "standard kernel features (expert users)" menu +config BUILDID_H + bool + # syscall, maps, verifier config BPF_SYSCALL bool "Enable bpf() system call" diff --git a/scripts/Makefile b/scripts/Makefile index 25ab143cbe14..fa34eaed6c29 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -19,6 +19,7 @@ hostprogs-$(CONFIG_ASN1) += asn1_compiler hostprogs-$(CONFIG_MODULE_SIG) += sign-file hostprogs-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += extract-cert hostprogs-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert +hostprogs-$(CONFIG_BUILDID_H) += extract-buildid HOSTCFLAGS_sortextable.o = -I$(srctree)/tools/include HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include diff --git a/scripts/extract-buildid.c b/scripts/extract-buildid.c new file mode 100644 index 000000000000..a116723da3ad --- /dev/null +++ b/scripts/extract-buildid.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Formats buildid into following macros: + * + * #define LINUX_BUILDID_DATA "\x6c\x41\x0f\xea\xa9\x5d\x46 ... + * #define LINUX_BUILDID_SIZE 20 + * + */ +#include <string.h> +#include <stdio.h> + +int main(int argc, char **argv) +{ + char *id; + int len, i; + + if (argc != 2) { + fprintf(stderr, "usage: %s buildid\n", argv[0]); + return -1; + } + + id = argv[1]; + len = strlen(id); + + printf("#ifndef _LINUX_BUILDID_H\n"); + printf("#define _LINUX_BUILDID_H\n"); + printf("\n"); + + printf("#define LINUX_BUILDID_DATA \""); + + for (i = 0; i < len; i += 2) + printf("\\x%c%c", id[i], id[i + 1]); + + printf("\"\n"); + + printf("#define LINUX_BUILDID_SIZE %u\n", len / 2); + + printf("\n"); + printf("#endif /* _LINUX_BUILDID_H */\n"); + return 0; +} -- 2.13.6 -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html