On Fri, 2024-09-20 at 00:49 -0700, Tony Ambardar wrote:
> While building of vmlinux employs a linker script to align the .BTF_ids
> section to 4 bytes, other usage leaves .BTF_ids unaligned and may lead to
> problems (e.g. [1]). Post-processing and libelf-based endian translation by
> resolve_btfids may also potentially suffer from misalignment.
>
> Update encoding macros in btf_ids.h to always align BTF ID data to 4 bytes.
>
> [1]: 3effc06a4dde ("selftests/bpf: Fix alignment of .BTF_ids")
>
> Signed-off-by: Tony Ambardar <[email protected]>
> ---
> include/linux/btf_ids.h | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/include/linux/btf_ids.h b/include/linux/btf_ids.h
> index c0e3e1426a82..c10b163dc340 100644
> --- a/include/linux/btf_ids.h
> +++ b/include/linux/btf_ids.h
> @@ -89,6 +89,7 @@ word
> \
> #define __BTF_ID_LIST(name, scope) \
> asm( \
> ".pushsection " BTF_IDS_SECTION ",\"a\"; \n" \
> +".balign 4, 0; \n" \
> "." #scope " " #name "; \n" \
> #name ":; \n" \
> ".popsection; \n");
This forces all id list symbols to be aligned on 4 bytes.
Should the same be done for __BTF_SET_START?
Also, is it guaranteed that all btf ids are organized in lists and sets?
Grepping through the code it seems they are, but it looks like resolve_btfids
does not really enforce this, simply looking for symbols matching a special name
__BTF_ID__<type>__<symbol>[__<id>] .