On 21/05/2024 23:01, Andrii Nakryiko wrote: > On Tue, May 21, 2024 at 12:08 PM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: >> >> On Tue, 2024-05-21 at 11:54 -0700, Andrii Nakryiko wrote: >> >> [...] >> >>> I'm probably leaning towards not doing automatic relocations in >>> btf__parse(), tbh. Distilled BTF is a rather special kernel-specific >>> feature, if we need to teach resolve_btfids and bpftool to do >>> something extra for that case (i.e., call another API for relocation, >>> if necessary), then it's fine, doesn't seems like a problem. >> >> My point is that with current implementation it does not even make >> sense to call btf__parse() for an ELF with distilled base, >> because it would fail. > > True (unless application loaded .BTF.base as stand-alone BTF first, > but it's pretty advanced scenario) > >> >> And selecting BTF encoding based on a few retries seems like a kludge >> if there is a simple way to check if distilled base has to be used >> (presence of the .BTF.base section). > > agreed > >> >>> Much worse is having to do some workarounds to prevent an API from >>> doing some undesired extra steps (like in resolve_btfids not wanting a >>> relocation). Orthogonality FTW, IMO. >> >> For resolve_btfids it is a bit different, imo. >> It does want some base: for in-tree modules it wants vmlinux, >> for out-of-tree it wants distilled base. >> So it has to be adjusted either way. > > Ok, so I read some more code and re-read your discussion w/ Alan. I > agree with your proposal, I think it's logical (even if relocation > does feel a bit "extra" for "parse"-like API, but ok, whatever). > > I see what you are saying about resolve_btfids needing the changes > either way, and that's true. But instead of adding (unnecessary, IMO) > -R argument, resolve_btfids should be able to detect .BTF.base section > presence and infer that this is distilled BTF case, and thus proceed > with ignoring `-B <vmlinux>` argument (we can even complain that `-B > vmlinux` is specified if distilled BTF is used, not sure. That's a good idea; we already have ELF parsing in resolve_btfids, so as we can detect the .BTF.base presence there easily, no need for a parameter. I put together a quick proof-of-concept and it works well. This simplifies things considerably; we can eliminate the bpftool patches completely since ELF parsing does the right thing already, and the resolve_btfids change is small, with no user interface-visible changes there. Thanks! Alan