Thread (10 messages) 10 messages, 3 authors, 2021-05-04

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help