-
Notifications
You must be signed in to change notification settings - Fork 160
Description
Embedding a skeleton (Skel
) in an internal structure is quite useful, eg. for loading a program once and attaching it to functions on-demand later on (attach_kprobe
). Up until 0.22 it was possible to either embed a Skel
or an Object
(taking it out of the Skel
).
With the addition of commit c01e9b9 ("libbpf-cargo: Define maps as publicly accessible members") and follow-ups I'm now not sure how to have the same behavior, or if it is even possible. There are a few things preventing this:
- A storage (
MaybeUninit<libbpf_rs::OpenObject>
) needs to be provided to the skeleton builder to hold the (open)object and obviously have to live long enough. The internal structure now needs to embed both theSkel
and the storage, but this is impossible due to self-referencial. - To workaround the above we could try directly using the storage, without the
Skel
(after setting rodata). But internally it uses anOwnedRef
which will drop the storage if we don't keep theSkel
around. Or we needmem::forget(skel)
but that leaks memory (and does not look nice).
Then I thought maybe the skeleton isn't meant for such usage and we could build an Object
manually. This is honestly fine... until we need to access rodata. Then basically we go full circle and re-implement a skeleton (as we need the Rust rodata definition to be automatically generated to stay in-sync).
I'm not really sure how to proceed. Hopefully I'm missing something :)
Thanks!
(The actual code is there, https://github.com/retis-org/retis/blob/59948504aa2f0da99cefb53057f7995baf8eed0b/retis/src/core/probe/kernel/kprobe.rs, but it's a bit complex to grab everything w/o reading quite a lot of code so hopefully the above explanation describes the generic issue).