On Wed, Apr 28, 2021 at 5:15 PM Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote: > > On Wed, Apr 28, 2021 at 1:53 PM Grant Seltzer Richman > <grantseltzer@xxxxxxxxx> wrote: > > > > 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. > > > > > 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 > > > > > Thanks so much, > > Grant Seltzer