Re: Typical way to handle missing macros in vmlinux.h
From: Grant Seltzer Richman <hidden>
Date: 2021-05-03 18:32:31
On Wed, Apr 28, 2021 at 5:15 PM Andrii Nakryiko [off-list ref] wrote:
On Wed, Apr 28, 2021 at 1:53 PM Grant Seltzer Richman [off-list ref] wrote:quoted
Hi all, I'm working on enabling CO:RE in a project I work on, tracee, and am running into the dilemma of missing macros that we previously were able to import from their various header files. I understand that macros don't make their way into BTF and therefore the generated vmlinux.h won't have them. However I can't import the various header files because of multiple-definition issues.Sadly, copy/pasting has been the only way so far.quoted
Do people typically redefine each of these macros for their project? If so is there anything I should be careful of, such as architectural differences. Does anyone have creative ideas, even if not developed fully yet that I can possibly contribute to libbpf?We've discussed adding Clang built-in to detect if a specific type is already defined and doing something like this in vmlinux.h: #if !__builtin_is_type_defined(struct task_struct) struct task_struct { ... } #endif And just do that for every struct, union, typedef. That would allow vmlinux.h to co-exist (somewhat) with other types. Another alternative is to not use vmlinux.h and use just linux headers, but mark necessary types with __attribute__((preserve_access_index)) to make them CO-RE relocatable. You can add that to existing types with the same pragma that vmlinux.h uses.
I'm attempting to try doing the above. I'm just replacing bpf_probe_read with bpf_core_read and not importing vmlinux.h, just all the kernel headers I need. When you say "Add that to existing types with the same pragma that vmlinux.h uses", Should I be able to add the following to my bpf source file before importing my headers? ifndef BPF_NO_PRESERVE_ACCESS_INDEX #pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) #endif and then pop the attribute at the bottom of the file, or after the header includes. I've tried this and get a whole bunch of 'unknown attribute' warnings, leading me to believe that I either have something installed incorrectly or don't understand how to use clang attributes. Do I need to edit the types in the actual header files? Thank you very very much for the help! - Grant
quoted
Thanks so much, Grant Seltzer