On Sat, Sep 21, 2024 at 02:46:17AM -0700, Eduard Zingerman wrote:
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.
Signed-off-by: Tony Ambardar tony.ambardar@gmail.com
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?
it seems all the set macros use __BTF_ID_LIST, so it should be taken care of by that
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>] .
yes, you need the BTF_ID to be part of list or set to be able to access it
resolve_btfids does not enforce some loose BTF_ID definition without list/set, but that does not seem to be a problem
thanks, jirka