diff --git a/.dwarves.metadata b/.dwarves.metadata index 9f7fdfd..9a78889 100644 --- a/.dwarves.metadata +++ b/.dwarves.metadata @@ -1 +1 @@ -ca9684e13a39c9333d2c54b09d421fd65c23d951 SOURCES/dwarves-1.22.tar.xz +2f743d3dc421ae8478cb47051449c721b77f51ab SOURCES/dwarves-1.24.tar.xz diff --git a/.gitignore b/.gitignore index 08686e2..ce6ec7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/dwarves-1.22.tar.xz +SOURCES/dwarves-1.24.tar.xz diff --git a/SOURCES/0001-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch b/SOURCES/0001-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch new file mode 100644 index 0000000..5d90d12 --- /dev/null +++ b/SOURCES/0001-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch @@ -0,0 +1,93 @@ +From b72f5188856df0abf45e1a707856bb4e4e86153c Mon Sep 17 00:00:00 2001 +From: Alan Maguire +Date: Fri, 21 Oct 2022 16:02:03 +0100 +Subject: [PATCH] dwarves: Zero-initialize struct cu in cu__new() to prevent + incorrect BTF types + +BTF deduplication was throwing some strange results, where core kernel +data types were failing to deduplicate due to the return values +of function type members being void (0) instead of the actual type +(unsigned int). An example of this can be seen below, where +"struct dst_ops" was failing to deduplicate between kernel and +module: + +struct dst_ops { + short unsigned int family; + unsigned int gc_thresh; + int (*gc)(struct dst_ops *); + struct dst_entry * (*check)(struct dst_entry *, __u32); + unsigned int (*default_advmss)(const struct dst_entry *); + unsigned int (*mtu)(const struct dst_entry *); +... + +struct dst_ops___2 { + short unsigned int family; + unsigned int gc_thresh; + int (*gc)(struct dst_ops___2 *); + struct dst_entry___2 * (*check)(struct dst_entry___2 *, __u32); + void (*default_advmss)(const struct dst_entry___2 *); + void (*mtu)(const struct dst_entry___2 *); +... + +This was seen with + +bcc648a10cbc ("btf_encoder: Encode DW_TAG_unspecified_type returning routines as void") + +...which rewrites the return value as 0 (void) when it is marked +as matching DW_TAG_unspecified_type: + +static int32_t btf_encoder__tag_type(struct btf_encoder *encoder, uint32_t type_id_off, uint32_t tag_type) +{ + if (tag_type == 0) + return 0; + + if (encoder->cu->unspecified_type.tag && tag_type == encoder->cu->unspecified_type.type) { + // No provision for encoding this, turn it into void. + return 0; + } + + return type_id_off + tag_type; +} + +However the odd thing was that on further examination, the unspecified type +was not being set, so why was this logic being tripped? Futher debugging +showed that the encoder->cu->unspecified_type.tag value was garbage, and +the type id happened to collide with "unsigned int"; as a result we +were replacing unsigned ints with void return values, and since this +was being done to function type members in structs, it triggered a +type mismatch which failed deduplication between kernel and module. + +The fix is simply to calloc() the cu in cu__new() instead. + +Committer notes: + +We have zalloc(size) as an alias to calloc(1, size), use it instead. + +Fixes: bcc648a10cbcd0b9 ("btf_encoder: Encode DW_TAG_unspecified_type returning routines as void") +Signed-off-by: Alan Maguire +Acked-by: Andrii Nakryiko +Acked-by: Jiri Olsa +Cc: bpf@vger.kernel.org +Cc: dwarves@vger.kernel.org +Link: https://lore.kernel.org/r/1666364523-9648-1-git-send-email-alan.maguire@oracle.com +Signed-off-by: Arnaldo Carvalho de Melo +--- + dwarves.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dwarves.c b/dwarves.c +index fbebc1d..95a3bac 100644 +--- a/dwarves.c ++++ b/dwarves.c +@@ -626,7 +626,7 @@ struct cu *cu__new(const char *name, uint8_t addr_size, + const unsigned char *build_id, int build_id_len, + const char *filename, bool use_obstack) + { +- struct cu *cu = malloc(sizeof(*cu) + build_id_len); ++ struct cu *cu = zalloc(sizeof(*cu) + build_id_len); + + if (cu != NULL) { + uint32_t void_id; +-- +2.38.1 + diff --git a/SPECS/dwarves.spec b/SPECS/dwarves.spec index 6c5de6c..60f9c09 100644 --- a/SPECS/dwarves.spec +++ b/SPECS/dwarves.spec @@ -2,13 +2,14 @@ %define libver 1 Name: dwarves -Version: 1.22 -Release: 1%{?dist} +Version: 1.24 +Release: 2%{?dist} License: GPLv2 Summary: Debugging Information Manipulation Tools (pahole & friends) URL: http://acmel.wordpress.com Source: http://fedorapeople.org/~acme/dwarves/%{name}-%{version}.tar.xz Requires: %{libname}%{libver} = %{version}-%{release} +Patch1: 0001-dwarves-Zero-initialize-struct-cu-in-cu__new-to-prev.patch BuildRequires: gcc BuildRequires: cmake >= 2.8.12 BuildRequires: zlib-devel @@ -65,6 +66,7 @@ Debugging information processing library development files. %prep %setup -q +%patch1 -p1 %build %cmake -DCMAKE_BUILD_TYPE=Release . @@ -79,7 +81,8 @@ rm -Rf %{buildroot} %files %doc README.ctracer %doc README.btf -%doc changes-v1.22 +%doc changes-v1.23 +%doc changes-v1.24 %doc NEWS %{_bindir}/btfdiff %{_bindir}/codiff @@ -131,6 +134,29 @@ rm -Rf %{buildroot} %{_libdir}/%{libname}_reorganize.so %changelog +* Wed Nov 16 2022 Viktor Malik - 1.24-2 +- Backport BTF fix needed for kernel kfuncs +- Related: rhbz#2140020 + +* Fri Nov 04 2022 Viktor Malik - 1.24-1 +- Resolves: rhbz#2140020 +- New release: v1.23 +- Process DW_TAG_LLVM_annotation tags. +- Initial support for DW_TAG_skeleton_unit. +- Encode BTF_KIND_TYPE_TAG and BTF_KIND_DECL_TAG +- Fix handling of percpu symbols on s390. +- Use cacheline size to infer struct member alignment from BTF. +- Add --skip_missing to not stop when not finding one of -C arguments. +- Fix __attribute__((__aligned__(N)) printing alignment for struct members. +- Fix nested __attribute__(__aligned__(N)) struct printing order. +- New release: v1.24 +- Add support to BTF_KIND_ENUM64. +- Support multithreaded BTF encoding. +- Encode char type as signed in BTF. +- Introduce --lang and --lang_exclude to pahole. +- Introduce --compile to pahole. +- Don't segfault when processing bogus files. + * Wed Oct 6 2021 Jiri Olsa - 1.22-1 - New release: v1.22 - Resolves: rhbz#2010414