Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
core: Check that we're adding DW_TAG_member sorted by byte offset
Rust reorder struct fields and pahole assumes them to be in order, as is the case for languages like C and C++, etc. So when adding a DW_TAG_member, add it in order. Using: https://github.com/Rust-for-Linux/pahole-rust-cases/blob/main/inverted.o Before: $ pahole --show_private_classes ../pahole-rust-cases/inverted.o struct S { /* XXX 4 bytes hole, try to pack */ bool a __attribute__((__aligned__(1))); /* 4 1 */ /* XXX 65531 bytes hole, try to pack */ /* Bitfield combined with previous fields */ u32 b __attribute__((__aligned__(4))); /* 0 4 */ /* size: 8, cachelines: 1, members: 2 */ /* sum members: 5, holes: 2, sum holes: 65535 */ /* padding: 4 */ /* forced alignments: 2, forced holes: 2, sum forced holes: 65535 */ /* last cacheline: 8 bytes */ /* BRAIN FART ALERT! 8 bytes != 5 (member bytes) + 0 (member bits) + 65535 (byte holes) + 0 (bit holes), diff = -524288 bits */ } __attribute__((__aligned__(4))); $ After: $ readelf -wi ../pahole-rust-cases/inverted.o | grep DW_TAG_compile_unit -A9 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) <c> DW_AT_producer : (indirect string, offset: 0x0): clang LLVM (rustc version 1.60.0 (7737e0b5c 2022-04-04)) <10> DW_AT_language : 28 (Rust) <12> DW_AT_name : (indirect string, offset: 0x39): inverted.rs/@/inverted.c4dda47b-cgu.0 <16> DW_AT_stmt_list : 0x0 <1a> DW_AT_comp_dir : (indirect string, offset: 0x5f): /root/pahole-rust <1e> DW_AT_GNU_pubnames: 1 <1e> DW_AT_low_pc : 0x0 <26> DW_AT_high_pc : 0x62 <1><2a>: Abbrev Number: 2 (DW_TAG_namespace) $ pahole --show_private_classes ../pahole-rust-cases/inverted.o struct S { u32 b __attribute__((__aligned__(4))); /* 0 4 */ bool a __attribute__((__aligned__(1))); /* 4 1 */ /* size: 8, cachelines: 1, members: 2 */ /* padding: 3 */ /* forced alignments: 2 */ /* last cacheline: 8 bytes */ } __attribute__((__aligned__(4))); $ $ cp ../pahole-rust-cases/inverted.o . $ pahole --btf_encode inverted.o $ readelf -SW inverted.o | grep -i BTF [26] .BTF PROGBITS 0000000000000000 000922 00006c 00 0 0 1 $ $ pahole -F btf inverted.o struct S { u32 b; /* 0 4 */ bool a; /* 4 1 */ /* size: 8, cachelines: 1, members: 2 */ /* padding: 3 */ /* last cacheline: 8 bytes */ }; $ Reported-by: Miguel Ojeda <[email protected]> Cc: Alexei Starovoitov <[email protected]> Cc: Andrii Nakryiko <[email protected]> Cc: Eric Curtin <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Martin Rodriguez Reboredo <[email protected]> Cc: Neal Gompa <[email protected]> Cc: Yonghong Song <[email protected]> Cc: Daniel Borkmann <[email protected]> Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
- Loading branch information