From: Jiri Olsa <jolsa@kernel.org> Date: 2021-02-23 13:24:28
hi,
I cleaned up a bit my testing scripts, that I'm using for testing
btf encoding changes. It's far from ideal and convoluted, but let's
have discussion if this could be kicked into something useful for
everybody.
There are 2 scripts:
kernel-objects-build.sh - compiles kernel for several archs and
stores vmlinux and kernel modules
kernel-objects-test.sh - goes through objects stored by ^^^
and runs tests on each of them
The general idea is that all objects are compiled already with
BTF debuginfo with available pahole. The test script then:
- takes each objects and dumps its current BTF data
- then create new BTF data with given pahole binary
- dumps the new BTF data and makes the comparison
I was thinking about support for comparing 2 pahole binaries,
but so far that did not fit into my workflow. Normally I have
latest globally available pahole, which is used to build the
kernel binaries and then I'm playing with new pahole binary,
which I'm putting to the test.
Example.. prepare vmlinux and modules for all archs:
$ ./kernel-objects-build.sh
output: /tmp/pahole.test.nsQ
kdir: /home/jolsa/linux
pahole: /opt/dwarves/bin/pahole
objects: /home/jolsa/.pahole_test_objects
cleanup /home/jolsa/linux
...
All objects are stored under ~/pahole_test_objects/ directories:
$ ls ~/.pahole_test_objects/
aarch64-clang
aarch64-gcc
powerpc-gcc
powerpcle-gcc
s390x-gcc
x86-clang
x86-gcc
Each containing vmlinux and modules:
$ ls ~/.pahole_test_objects/x86-gcc/
efivarfs.ko iptable_nat.ko nf_log_arp.ko nf_log_common.ko nf_log_ipv4.ko nf_log_ipv6.ko
vmlinux x86_pkg_temp_thermal.ko xt_addrtype.ko xt_LOG.ko xt_mark.ko xt_MASQUERADE.ko xt_nat.ko
Run test on all of them with new './pahole' binary:
$ ./kernel-objects-test.sh -B ~/linux/tools/bpf/bpftool/bpftool -P ./pahole
pahole: /home/jolsa/pahole/build/pahole
bpftool: /home/jolsa/linux/tools/bpf/bpftool/bpftool
base: /tmp/pahole.test.oxv
objects: /home/jolsa/.pahole_test_objects
fail: no
cleanup: yes
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... OK
test_btfdiff on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... FAIL
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/8021q.ko ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/8021q.ko ... OK
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/act_gact.ko ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/act_gact.ko ... OK
...
There are several options that helps to set other binaries/dirs
or stop and debug issues.
thoughts?
thanks,
jirka
---
kernel-objects-build.sh | 132 +++++++++++++++++++
kernel-objects-test.sh | 282 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 414 insertions(+)
create mode 100755 kernel-objects-build.sh
create mode 100755 kernel-objects-test.sh
Hi Jiri,
Just some drive by comments. I think the idea is neat, I am always a fan
of automating more things :)
On Tue, Feb 23, 2021 at 02:23:21PM +0100, Jiri Olsa wrote:
quoted hunk
hi,
I cleaned up a bit my testing scripts, that I'm using for testing
btf encoding changes. It's far from ideal and convoluted, but let's
have discussion if this could be kicked into something useful for
everybody.
There are 2 scripts:
kernel-objects-build.sh - compiles kernel for several archs and
stores vmlinux and kernel modules
kernel-objects-test.sh - goes through objects stored by ^^^
and runs tests on each of them
The general idea is that all objects are compiled already with
BTF debuginfo with available pahole. The test script then:
- takes each objects and dumps its current BTF data
- then create new BTF data with given pahole binary
- dumps the new BTF data and makes the comparison
I was thinking about support for comparing 2 pahole binaries,
but so far that did not fit into my workflow. Normally I have
latest globally available pahole, which is used to build the
kernel binaries and then I'm playing with new pahole binary,
which I'm putting to the test.
Example.. prepare vmlinux and modules for all archs:
$ ./kernel-objects-build.sh
output: /tmp/pahole.test.nsQ
kdir: /home/jolsa/linux
pahole: /opt/dwarves/bin/pahole
objects: /home/jolsa/.pahole_test_objects
cleanup /home/jolsa/linux
...
All objects are stored under ~/pahole_test_objects/ directories:
$ ls ~/.pahole_test_objects/
aarch64-clang
aarch64-gcc
powerpc-gcc
powerpcle-gcc
s390x-gcc
x86-clang
x86-gcc
Each containing vmlinux and modules:
$ ls ~/.pahole_test_objects/x86-gcc/
efivarfs.ko iptable_nat.ko nf_log_arp.ko nf_log_common.ko nf_log_ipv4.ko nf_log_ipv6.ko
vmlinux x86_pkg_temp_thermal.ko xt_addrtype.ko xt_LOG.ko xt_mark.ko xt_MASQUERADE.ko xt_nat.ko
Run test on all of them with new './pahole' binary:
$ ./kernel-objects-test.sh -B ~/linux/tools/bpf/bpftool/bpftool -P ./pahole
pahole: /home/jolsa/pahole/build/pahole
bpftool: /home/jolsa/linux/tools/bpf/bpftool/bpftool
base: /tmp/pahole.test.oxv
objects: /home/jolsa/.pahole_test_objects
fail: no
cleanup: yes
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... OK
test_btfdiff on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... FAIL
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/8021q.ko ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/8021q.ko ... OK
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/act_gact.ko ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/act_gact.ko ... OK
...
There are several options that helps to set other binaries/dirs
or stop and debug issues.
thoughts?
thanks,
jirka
---
kernel-objects-build.sh | 132 +++++++++++++++++++
kernel-objects-test.sh | 282 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 414 insertions(+)
create mode 100755 kernel-objects-build.sh
create mode 100755 kernel-objects-test.sh
From: Arnaldo Carvalho de Melo <acme@kernel.org> Date: 2021-08-20 20:39:28
Em Tue, Feb 23, 2021 at 02:23:21PM +0100, Jiri Olsa escreveu:
hi,
I cleaned up a bit my testing scripts, that I'm using for testing
btf encoding changes. It's far from ideal and convoluted, but let's
have discussion if this could be kicked into something useful for
everybody.
There are 2 scripts:
kernel-objects-build.sh - compiles kernel for several archs and
stores vmlinux and kernel modules
kernel-objects-test.sh - goes through objects stored by ^^^
and runs tests on each of them
The general idea is that all objects are compiled already with
BTF debuginfo with available pahole. The test script then:
- takes each objects and dumps its current BTF data
- then create new BTF data with given pahole binary
- dumps the new BTF data and makes the comparison
I was thinking about support for comparing 2 pahole binaries,
but so far that did not fit into my workflow. Normally I have
latest globally available pahole, which is used to build the
kernel binaries and then I'm playing with new pahole binary,
which I'm putting to the test.
Example.. prepare vmlinux and modules for all archs:
$ ./kernel-objects-build.sh
output: /tmp/pahole.test.nsQ
kdir: /home/jolsa/linux
pahole: /opt/dwarves/bin/pahole
objects: /home/jolsa/.pahole_test_objects
cleanup /home/jolsa/linux
...
All objects are stored under ~/pahole_test_objects/ directories:
$ ls ~/.pahole_test_objects/
aarch64-clang
aarch64-gcc
powerpc-gcc
powerpcle-gcc
s390x-gcc
x86-clang
x86-gcc
Each containing vmlinux and modules:
$ ls ~/.pahole_test_objects/x86-gcc/
efivarfs.ko iptable_nat.ko nf_log_arp.ko nf_log_common.ko nf_log_ipv4.ko nf_log_ipv6.ko
vmlinux x86_pkg_temp_thermal.ko xt_addrtype.ko xt_LOG.ko xt_mark.ko xt_MASQUERADE.ko xt_nat.ko
Run test on all of them with new './pahole' binary:
$ ./kernel-objects-test.sh -B ~/linux/tools/bpf/bpftool/bpftool -P ./pahole
pahole: /home/jolsa/pahole/build/pahole
bpftool: /home/jolsa/linux/tools/bpf/bpftool/bpftool
base: /tmp/pahole.test.oxv
objects: /home/jolsa/.pahole_test_objects
fail: no
cleanup: yes
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... OK
test_btfdiff on /home/jolsa/.pahole_test_objects/aarch64-clang/vmlinux ... FAIL
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/8021q.ko ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/8021q.ko ... OK
test_funcs on /home/jolsa/.pahole_test_objects/aarch64-clang/act_gact.ko ... OK
test_format_c on /home/jolsa/.pahole_test_objects/aarch64-clang/act_gact.ko ... OK
...
There are several options that helps to set other binaries/dirs
or stop and debug issues.
thoughts?
So far:
should look in other places for getting the kernel sources directory,
myne is at $(HOME)/git/linux/, kernel-objects-build.sh is looking at
$(HOME)/linux/
Maybe we can use this, if there is any locally built kernel:
[acme@quaco pahole]$ ls -la /lib/modules/5.10.0-rc5/source
lrwxrwxrwx. 1 root root 20 Nov 23 2020 /lib/modules/5.10.0-rc5/source -> /home/acme/git/linux
[acme@quaco pahole]$
Or look at $HOME/git/linux/ too if not finding it in $HOME/linux/
Also it is building in the source tree, would be better to create a temp
dir and use O=.
Trying it:
⬢[acme@toolbox pahole]$ ./kernel-objects-build.sh
output: /tmp/pahole.test.0su
kdir: /var/home/acme/git/linux
pahole: /var/home/acme/git/pahole/build/pahole
objects: /var/home/acme/.pahole_test_objects
cleanup /var/home/acme/git/linux
make: Entering directory '/var/home/acme/git/linux'
make: Leaving directory '/var/home/acme/git/linux'
build x86-clang (/tmp/pahole.test.0su/output)
~/git/linux ~/git/pahole
~/git/pahole
build x86-gcc (/tmp/pahole.test.0su/output)
~/git/linux ~/git/pahole
rpm~/git/pahole
build aarch64-clang (/tmp/pahole.test.0su/output)
~/git/linux ~/git/pahole
⬢[acme@toolbox pahole]$
⬢[acme@toolbox pahole]$ ls -la ~/.pahole_test_objects/
total 0
drwxr-xr-x. 1 acme acme 58 Aug 20 17:24 .
drwx------. 1 acme acme 1346 Aug 20 17:31 ..
drwxr-xr-x. 1 acme acme 0 Aug 20 17:24 aarch64-clang
drwxr-xr-x. 1 acme acme 258 Aug 20 17:21 x86-clang
drwxr-xr-x. 1 acme acme 258 Aug 20 17:24 x86-gcc
⬢[acme@toolbox pahole]$
⬢[acme@toolbox pahole]$ ls -la ~/.pahole_test_objects/aarch64-clang/
total 0
drwxr-xr-x. 1 acme acme 0 Aug 20 17:24 .
drwxr-xr-x. 1 acme acme 58 Aug 20 17:24 ..
⬢[acme@toolbox pahole]$ ls -la ~/.pahole_test_objects/x86-clang/
total 592512
drwxr-xr-x. 1 acme acme 258 Aug 20 17:21 .
drwxr-xr-x. 1 acme acme 58 Aug 20 17:24 ..
-rw-r--r--. 1 acme acme 392920 Aug 20 17:21 efivarfs.ko
-rw-r--r--. 1 acme acme 388384 Aug 20 17:21 iptable_nat.ko
-rw-r--r--. 1 acme acme 471896 Aug 20 17:21 nf_log_syslog.ko
-rwxr-xr-x. 1 acme acme 603366392 Aug 20 17:21 vmlinux
-rw-r--r--. 1 acme acme 245272 Aug 20 17:21 x86_pkg_temp_thermal.ko
-rw-r--r--. 1 acme acme 397128 Aug 20 17:21 xt_addrtype.ko
-rw-r--r--. 1 acme acme 375536 Aug 20 17:21 xt_LOG.ko
-rw-r--r--. 1 acme acme 292320 Aug 20 17:21 xt_mark.ko
-rw-r--r--. 1 acme acme 383824 Aug 20 17:21 xt_MASQUERADE.ko
-rw-r--r--. 1 acme acme 401672 Aug 20 17:21 xt_nat.ko
⬢[acme@toolbox pahole]$ ls -la ~/.pahole_test_objects/x86-gcc/
total 699988
drwxr-xr-x. 1 acme acme 258 Aug 20 17:24 .
drwxr-xr-x. 1 acme acme 58 Aug 20 17:24 ..
-rw-r--r--. 1 acme acme 485112 Aug 20 17:24 efivarfs.ko
-rw-r--r--. 1 acme acme 419520 Aug 20 17:24 iptable_nat.ko
-rw-r--r--. 1 acme acme 514512 Aug 20 17:24 nf_log_syslog.ko
-rwxr-xr-x. 1 acme acme 713044328 Aug 20 17:24 vmlinux
-rw-r--r--. 1 acme acme 301256 Aug 20 17:24 x86_pkg_temp_thermal.ko
-rw-r--r--. 1 acme acme 431712 Aug 20 17:24 xt_addrtype.ko
-rw-r--r--. 1 acme acme 403384 Aug 20 17:24 xt_LOG.ko
-rw-r--r--. 1 acme acme 316528 Aug 20 17:24 xt_mark.ko
-rw-r--r--. 1 acme acme 411992 Aug 20 17:24 xt_MASQUERADE.ko
-rw-r--r--. 1 acme acme 435312 Aug 20 17:24 xt_nat.ko
⬢[acme@toolbox pahole]$
It didn't build bpftool so I have to do it now:
⬢[acme@toolbox pahole]$ cd ../linux
⬢[acme@toolbox linux]$ make -C tools/bpf/bpftool/
make: Entering directory '/var/home/acme/git/linux/tools/bpf/bpftool'
Auto-detecting system features:
... libbfd: [ on ]
... disassembler-four-args: [ on ]
... zlib: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
CC btf.o
<SNIP>
CC struct_ops.o
CC tracelog.o
CC xlated_dumper.o
CC jit_disasm.o
CC disasm.o
LINK bpftool
make: Leaving directory '/var/home/acme/git/linux/tools/bpf/bpftool'
⬢[acme@toolbox linux]$
⬢[acme@toolbox linux]$ cd -
/var/home/acme/git/pahole
⬢[acme@toolbox pahole]$
⬢[acme@toolbox pahole]$ ./kernel-objects-test.sh -B ~/git/linux/tools/bpf/bpftool/bpftool -P build/pahole
/usr/bin/which: no bpftool in (/var/home/acme/.local/bin:/var/home/acme/bin:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
pahole: /var/home/acme/git/pahole/build/pahole
bpftool: /var/home/acme/git/linux/tools/bpf/bpftool/bpftool
base: /tmp/pahole.test.4of
objects: /var/home/acme/.pahole_test_objects
fail: no
cleanup: yes
test_funcs on /var/home/acme/.pahole_test_objects/aarch64-clang/vmlinux ... cp: cannot stat '/var/home/acme/.pahole_test_objects/aarch64-clang/vmlinux': No such file or directory
Error: failed to load BTF from /tmp/pahole.test.4of/object: No such file or directory
pahole: /tmp/pahole.test.4of/object: No such file or directory
Error: failed to load BTF from /tmp/pahole.test.4of/object: No such file or directory
OK
test_format_c on /var/home/acme/.pahole_test_objects/aarch64-clang/vmlinux ... cp: cannot stat '/var/home/acme/.pahole_test_objects/aarch64-clang/vmlinux': No such file or directory
Error: failed to load BTF from /tmp/pahole.test.4of/object: No such file or directory
pahole: /tmp/pahole.test.4of/object: No such file or directory
Error: failed to load BTF from /tmp/pahole.test.4of/object: No such file or directory
OK
test_btfdiff on /var/home/acme/.pahole_test_objects/aarch64-clang/vmlinux ... OK
ls: cannot access '/var/home/acme/.pahole_test_objects/aarch64-clang/*.ko': No such file or directory
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/vmlinux ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/vmlinux ... OK
test_btfdiff on /var/home/acme/.pahole_test_objects/x86-clang/vmlinux ... FAIL
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/efivarfs.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/efivarfs.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/iptable_nat.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/iptable_nat.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/nf_log_syslog.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/nf_log_syslog.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/x86_pkg_temp_thermal.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/x86_pkg_temp_thermal.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/xt_addrtype.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/xt_addrtype.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/xt_LOG.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/xt_LOG.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/xt_mark.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/xt_mark.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/xt_MASQUERADE.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/xt_MASQUERADE.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-clang/xt_nat.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-clang/xt_nat.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/vmlinux ... Ignoring zero-sized per-CPU variable 'pagesets'...
OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/vmlinux ... Ignoring zero-sized per-CPU variable 'pagesets'...
OK
test_btfdiff on /var/home/acme/.pahole_test_objects/x86-gcc/vmlinux ... FAIL
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/efivarfs.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/efivarfs.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/iptable_nat.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/iptable_nat.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/nf_log_syslog.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/nf_log_syslog.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/x86_pkg_temp_thermal.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/x86_pkg_temp_thermal.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/xt_addrtype.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/xt_addrtype.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/xt_LOG.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/xt_LOG.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/xt_mark.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/xt_mark.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/xt_MASQUERADE.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/xt_MASQUERADE.ko ... OK
test_funcs on /var/home/acme/.pahole_test_objects/x86-gcc/xt_nat.ko ... OK
test_format_c on /var/home/acme/.pahole_test_objects/x86-gcc/xt_nat.ko ... OK
⬢[acme@toolbox pahole]$
So, now looking at:
test_btfdiff on /var/home/acme/.pahole_test_objects/x86-gcc/vmlinux ... FAIL
Overall, I like it, will add also the 'fullcircle' test for some of the
single CU kernel objects and add detached BTF tests.
- Arnaldo
⬢[acme@toolbox pahole]$o
I see, there are two declarations for this struct, one at:
drivers/net/ethernet/intel/e1000/e1000_param.c
166 struct e1000_option {
167 enum { enable_option, range_option, list_option } type;
168 const char *name;
169 const char *err;
170 int def;
171 union {
172 struct { /* range_option info */
173 int min;
174 int max;
175 } r;
176 struct { /* list_option info */
177 int nr;
178 const struct e1000_opt_list { int i; char *str; } *p;
179 } l;
180 } arg;
181 };
and the other at (note that extra 'e' after 1000 :) ):
drivers/net/ethernet/intel/e1000e/param.c
141 struct e1000_option {
142 enum { enable_option, range_option, list_option } type;
143 const char *name;
144 const char *err;
145 int def;
146 union {
147 /* range_option info */
148 struct {
149 int min;
150 int max;
151 } r;
152 /* list_option info */
153 struct {
154 int nr;
155 struct e1000_opt_list {
156 int i;
157 char *str;
158 } *p;
159 } l;
160 } arg;
161 };
The only difference is that 'const'.
I _guess_ that the BTF deduplicator is picking the one with the 'const'
while pahole's (which is just used when pretty printing, not when BTF
encoding) with the other (it shouldn't as per my intention, I'm not
arguing about if both should appear as different types).
I tested it with:
pahole -j -F dwarf -C e1000_option /var/home/acme/.pahole_test_objects/x86-gcc/vmlinux
to use the new DWARF multithreaded loading, like 'btfdiff' now does, and
its related to which of these types get loaded first, but its just
related to pahole pretty printing, not for the BTF encoding, where all
types will be passed to BTF for deduplication.
Same thing happens with clang, its just that when pretty printing in
this test run the clang multithreaded DWARF loading saw the type that
BTF picked (the one with 'const').
When I re-run it with:
⬢[acme@toolbox pahole]$ git diff
⬢[acme@toolbox pahole]$ git diff
I get:
test_btfdiff on /var/home/acme/.pahole_test_objects/aarch64-clang/vmlinux ... OK
test_btfdiff on /var/home/acme/.pahole_test_objects/x86-clang/vmlinux ... FAIL
clang's is just that zero entries array diff again.
I'll get 1.22 out of the door tomorrow as it passed these tests and also
the ones at libbpf github CI and my local ones and get these scripts merged
in 1.23, will check the clang output as well.
Thanks for the scripts!
- Arnaldo