While patching the .BTF_ids section in vmlinux, resolve_btfids writes type ids using host-native endianness, and relies on libelf for any required translation when finally updating vmlinux. However, the default type of the .BTF_ids section content is ELF_T_BYTE (i.e. unsigned char), and undergoes no translation. This results in incorrect patched values if cross-compiling to non-native endianness, and can manifest as kernel Oops and test failures which are difficult to debug. Explicitly set the type of patched data to ELF_T_WORD, allowing libelf to transparently handle the endian conversions. Fixes: fbbb68de80a4 ("bpf: Add resolve_btfids tool to resolve BTF IDs in ELF object") Cc: stable@xxxxxxxxxxxxxxx # v5.10+ Cc: Jiri Olsa <jolsa@xxxxxxxxxx> Cc: Yonghong Song <yhs@xxxxxx> Link: https://lore.kernel.org/bpf/CAPGftE_eY-Zdi3wBcgDfkz_iOr1KF10n=9mJHm1_a_PykcsoeA@xxxxxxxxxxxxxx/ Signed-off-by: Tony Ambardar <Tony.Ambardar@xxxxxxxxx> --- tools/bpf/resolve_btfids/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c index d636643ddd35..f32c059fbfb4 100644 --- a/tools/bpf/resolve_btfids/main.c +++ b/tools/bpf/resolve_btfids/main.c @@ -649,6 +649,9 @@ static int symbols_patch(struct object *obj) if (sets_patch(obj)) return -1; + /* Set type to ensure endian translation occurs. */ + obj->efile.idlist->d_type = ELF_T_WORD; + elf_flagdata(obj->efile.idlist, ELF_C_SET, ELF_F_DIRTY); err = elf_update(obj->efile.elf, ELF_C_WRITE); -- 2.25.1