kheaders.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/kobject.h>
  11. #include <linux/init.h>
  12. /*
  13. * Define kernel_headers_data and kernel_headers_data_end, within which the
  14. * compressed kernel headers are stored. The file is first compressed with xz.
  15. */
  16. asm (
  17. " .pushsection .rodata, \"a\" \n"
  18. " .global kernel_headers_data \n"
  19. "kernel_headers_data: \n"
  20. " .incbin \"kernel/kheaders_data.tar.xz\" \n"
  21. " .global kernel_headers_data_end \n"
  22. "kernel_headers_data_end: \n"
  23. " .popsection \n"
  24. );
  25. extern char kernel_headers_data;
  26. extern char kernel_headers_data_end;
  27. static ssize_t
  28. ikheaders_read(struct file *file, struct kobject *kobj,
  29. struct bin_attribute *bin_attr,
  30. char *buf, loff_t off, size_t len)
  31. {
  32. memcpy(buf, &kernel_headers_data + off, len);
  33. return len;
  34. }
  35. static struct bin_attribute kheaders_attr __ro_after_init = {
  36. .attr = {
  37. .name = "kheaders.tar.xz",
  38. .mode = 0444,
  39. },
  40. .read = &ikheaders_read,
  41. };
  42. static int __init ikheaders_init(void)
  43. {
  44. kheaders_attr.size = (&kernel_headers_data_end -
  45. &kernel_headers_data);
  46. return sysfs_create_bin_file(kernel_kobj, &kheaders_attr);
  47. }
  48. static void __exit ikheaders_cleanup(void)
  49. {
  50. sysfs_remove_bin_file(kernel_kobj, &kheaders_attr);
  51. }
  52. module_init(ikheaders_init);
  53. module_exit(ikheaders_cleanup);
  54. MODULE_LICENSE("GPL v2");
  55. MODULE_AUTHOR("Joel Fernandes");
  56. MODULE_DESCRIPTION("Echo the kernel header artifacts used to build the kernel");