On Thu, Feb 29, 2024 at 5:28 PM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: > > On Wed, 2024-02-28 at 16:02 -0800, Andrii Nakryiko wrote: > > On Wed, Feb 28, 2024 at 3:55 PM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: > > > > [...] > > > On Wed, 2024-02-28 at 15:43 -0800, Andrii Nakryiko wrote: > > > > > +SEC(".struct_ops.link") > > > > > > > > can you please also have a test where we use SEC("?.struct_ops.link") > > > > which set autoload to false by default? > > > > > > As far as I understand, that would be a new behavior, currently '?' > > > works only for programs. I'll add a separate patch to support this. > > > > > > > Yep, thanks! > > So, I have a draft for v2 with support for this feature in [0]. > But there is a gotcha: > > libbpf: BTF loading error: -22 > libbpf: -- BEGIN BTF LOAD LOG --- > ... > [23] DATASEC ?.struct_ops size=8 vlen=1 Invalid name > > -- END BTF LOAD LOG -- > libbpf: Error loading .BTF into kernel: -22. BTF is mandatory, can't proceed. > > Kernel rejects DATASEC name with '?'. > The options are: > 1. Tweak kernel to allow '?' as a first char in DATASEC names; > 2. Use some different name, e.g. ".struct_ops.opt"; > 3. Do some kind of BTF rewrite in libbpf to merge > "?.struct_ops" and ".struct_ops" DATASECs as a single DATASEC. > > (1) is simple, but downside is requirement for kernel upgrade; > (2) is simple, but goes against current convention for program section names; > (3) idk, will check if that is feasible tomorrow. > > [0] https://github.com/eddyz87/bpf/tree/structops-multi-version > > Let's do 1) for sure (ELF allows pretty much any name for DATASEC). And then detect this in libbpf, and if the kernel is old and doesn't yet support it, change DATASEC name from "?.struct_ops" to just ".struct_ops". Merging DATASECs seems like an unnecessary complication. >