linux/kernel/kheaders.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Provide kernel headers useful to build tracing programs
   4 * such as for running eBPF tracing tools.
   5 *
   6 * (Borrowed code from kernel/configs.c)
   7 */
   8
   9#include <linux/kernel.h>
  10#include <linux/module.h>
  11#include <linux/kobject.h>
  12#include <linux/init.h>
  13
  14/*
  15 * Define kernel_headers_data and kernel_headers_data_end, within which the
  16 * compressed kernel headers are stored. The file is first compressed with xz.
  17 */
  18
  19asm (
  20"       .pushsection .rodata, \"a\"             \n"
  21"       .global kernel_headers_data             \n"
  22"kernel_headers_data:                           \n"
  23"       .incbin \"kernel/kheaders_data.tar.xz\" \n"
  24"       .global kernel_headers_data_end         \n"
  25"kernel_headers_data_end:                       \n"
  26"       .popsection                             \n"
  27);
  28
  29extern char kernel_headers_data;
  30extern char kernel_headers_data_end;
  31
  32static ssize_t
  33ikheaders_read(struct file *file,  struct kobject *kobj,
  34               struct bin_attribute *bin_attr,
  35               char *buf, loff_t off, size_t len)
  36{
  37        memcpy(buf, &kernel_headers_data + off, len);
  38        return len;
  39}
  40
  41static struct bin_attribute kheaders_attr __ro_after_init = {
  42        .attr = {
  43                .name = "kheaders.tar.xz",
  44                .mode = 0444,
  45        },
  46        .read = &ikheaders_read,
  47};
  48
  49static int __init ikheaders_init(void)
  50{
  51        kheaders_attr.size = (&kernel_headers_data_end -
  52                              &kernel_headers_data);
  53        return sysfs_create_bin_file(kernel_kobj, &kheaders_attr);
  54}
  55
  56static void __exit ikheaders_cleanup(void)
  57{
  58        sysfs_remove_bin_file(kernel_kobj, &kheaders_attr);
  59}
  60
  61module_init(ikheaders_init);
  62module_exit(ikheaders_cleanup);
  63
  64MODULE_LICENSE("GPL v2");
  65MODULE_AUTHOR("Joel Fernandes");
  66MODULE_DESCRIPTION("Echo the kernel header artifacts used to build the kernel");
  67