diff --git a/_service b/_service
new file mode 100644
index 0000000..918b344
--- /dev/null
+++ b/_service
@@ -0,0 +1,16 @@
+
+
+ git
+ git://git.kernel.org/pub/scm/devel/pahole/pahole
+ master
+ v(.*)
+ @PARENT_TAG@+git@TAG_OFFSET@.%h
+ enable
+ dwarves
+
+
+ *.tar
+ xz
+
+
+
diff --git a/_servicedata b/_servicedata
new file mode 100644
index 0000000..4be9d11
--- /dev/null
+++ b/_servicedata
@@ -0,0 +1,4 @@
+
+
+ git://git.kernel.org/pub/scm/devel/pahole/pahole
+ 1ef87b26fd268b529b3568f3625d9eb10753a1a8
\ No newline at end of file
diff --git a/btf_encoder-fix-and-complete-filtering-out-zero-sized-per-CPU-variables.patch b/btf_encoder-fix-and-complete-filtering-out-zero-sized-per-CPU-variables.patch
deleted file mode 100644
index 92b3003..0000000
--- a/btf_encoder-fix-and-complete-filtering-out-zero-sized-per-CPU-variables.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From 0d17503db0580a6635d103fed030724b38ba1364 Mon Sep 17 00:00:00 2001
-From: Andrii Nakryiko
-Date: Mon, 24 May 2021 16:42:22 -0700
-Subject: [PATCH] btf_encoder: fix and complete filtering out zero-sized
- per-CPU variables
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Upstram: accepted - expected version 1.22
-Git-commit: 0d17503db0580a6635d103fed030724b38ba1364
-
-btf_encoder is ignoring zero-sized per-CPU ELF symbols, but the same has to be
-done for DWARF variables when matching them with ELF symbols. This is due to
-zero-sized DWARF variables matching unrelated (non-zero-sized) variable that
-happens to be allocated at the exact same address, leading to a lot of
-confusion in BTF.
-
-See [0] for when this causes big problems.
-
- [0] https://lore.kernel.org/bpf/CAEf4BzZ0-sihSL-UAm21JcaCCY92CqfNxycHRZYXcoj8OYb=wA@mail.gmail.com/
-
-Committer notes:
-
-Kept the {} around the if block with more than one line, which
-simplifies the original patch by just removing that assignment
-to the 'dwarf_name' variable.
-
-Reported-by: Michal Suchánek
-Signed-off-by: Andrii Nakryiko
-Cc: Jiri Olsa
-Cc: bpf@vger.kernel.org
-Cc: dwarves@vger.kernel.org
-Cc: kernel-team@fb.com
-Signed-off-by: Arnaldo Carvalho de Melo
----
- btf_encoder.c | 10 +++++++++-
- 1 file changed, 9 insertions(+), 1 deletion(-)
-
-diff --git a/btf_encoder.c b/btf_encoder.c
-index c711f12..033c927 100644
---- a/btf_encoder.c
-+++ b/btf_encoder.c
-@@ -538,6 +538,7 @@ int cu__encode_btf(struct cu *cu, int verbose, bool force,
- cu__for_each_variable(cu, core_id, pos) {
- uint32_t size, type, linkage;
- const char *name, *dwarf_name;
-+ const struct tag *tag;
- uint64_t addr;
- int id;
-
-@@ -550,6 +551,7 @@ int cu__encode_btf(struct cu *cu, int verbose, bool force,
-
- /* addr has to be recorded before we follow spec */
- addr = var->ip.addr;
-+ dwarf_name = variable__name(var, cu);
-
- /* DWARF takes into account .data..percpu section offset
- * within its segment, which for vmlinux is 0, but for kernel
-@@ -583,7 +585,6 @@ int cu__encode_btf(struct cu *cu, int verbose, bool force,
- * per-CPU symbols have non-zero values.
- */
- if (var->ip.addr == 0) {
-- dwarf_name = variable__name(var, cu);
- if (!dwarf_name || strcmp(dwarf_name, name))
- continue;
- }
-@@ -600,6 +601,13 @@ int cu__encode_btf(struct cu *cu, int verbose, bool force,
- break;
- }
-
-+ tag = cu__type(cu, var->ip.tag.type);
-+ if (tag__size(tag, cu) == 0) {
-+ if (btf_elf__verbose)
-+ fprintf(stderr, "Ignoring zero-sized per-CPU variable '%s'...\n", dwarf_name ?: "");
-+ continue;
-+ }
-+
- type = var->ip.tag.type + type_id_off;
- linkage = var->external ? BTF_VAR_GLOBAL_ALLOCATED : BTF_VAR_STATIC;
-
---
-2.31.1
-
diff --git a/dwarves-1.21+git175.1ef87b2.tar.xz b/dwarves-1.21+git175.1ef87b2.tar.xz
new file mode 100644
index 0000000..db91ebd
--- /dev/null
+++ b/dwarves-1.21+git175.1ef87b2.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ca6190d1ae24570a4162a085b9c525a9b7235e8c2a46ea655bbce248df90172
+size 910348
diff --git a/dwarves-1.21.tar.sign b/dwarves-1.21.tar.sign
deleted file mode 100644
index e51893e..0000000
--- a/dwarves-1.21.tar.sign
+++ /dev/null
@@ -1,7 +0,0 @@
------BEGIN PGP SIGNATURE-----
-
-iHUEABYIAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCYHRbEwAKCRCyPKLppCJ+
-J5LZAQCaEI/We6c5Qv/j2T6s+Ybeu4k6xWPj80MwCxjJKZBKpgD/b+fMM0g4FVcF
-dbiyE7Rca34D4M0vMH0mWwKs7SQ/YQI=
-=bOCB
------END PGP SIGNATURE-----
diff --git a/dwarves-1.21.tar.xz b/dwarves-1.21.tar.xz
deleted file mode 100644
index 7fcf006..0000000
--- a/dwarves-1.21.tar.xz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:33a8bed6c0e1a5889578e01d1afed3f752353dc087d8bda36d258fe83e42a476
-size 910480
diff --git a/dwarves-Prep-1.22.patch b/dwarves-Prep-1.22.patch
new file mode 100644
index 0000000..54fd905
--- /dev/null
+++ b/dwarves-Prep-1.22.patch
@@ -0,0 +1,14 @@
+--- dwarves-1.21+git175.1ef87b2/CMakeLists.txt 2021-06-17 02:07:22.000000000 +0200
++++ dwarves-1.21+git175.1ef87b2/CMakeLists.txt 2021-07-15 22:09:41.020434732 +0200
+@@ -53,9 +53,9 @@
+ endif (NOT DEFINED BUILD_SHARED_LIBS)
+
+ # Just for grepping, DWARVES_VERSION isn't used anywhere anymore
+-# add_definitions(-D_GNU_SOURCE -DDWARVES_VERSION="v1.21")
++# add_definitions(-D_GNU_SOURCE -DDWARVES_VERSION="v1.22")
+ add_definitions(-D_GNU_SOURCE -DDWARVES_MAJOR_VERSION=1)
+-add_definitions(-D_GNU_SOURCE -DDWARVES_MINOR_VERSION=21)
++add_definitions(-D_GNU_SOURCE -DDWARVES_MINOR_VERSION=22)
+ find_package(DWARF REQUIRED)
+ find_package(ZLIB REQUIRED)
+
diff --git a/dwarves.changes b/dwarves.changes
index 8b6a856..d7b9407 100644
--- a/dwarves.changes
+++ b/dwarves.changes
@@ -1,3 +1,23 @@
+-------------------------------------------------------------------
+Thu Jul 15 20:04:36 UTC 2021 - msuchanek@suse.com
+
+- Update to version 1.21+git175.1ef87b2 (jsc#SLE-17288):
+ * libbpf: bump dependency to >= 0.4.0
+ * CMakeLists.txt: Enable SHARED and STATIC lib creation
+ * libbpf: Allow to use packaged version
+ * btfdiff: Support diffing DWARF vs detached BTF
+ * pahole: Allow encoding BTF into a detached file
+ * pahole: Add --kabi_prefix flag
+ * btf_encoder: fix and complete filtering out zero-sized per-CPU variables
+ * btf: Remove ftrace filter
+ * pahole: Introduce --with_flexible_array option to show just types ending in a flexible array
+ * Many updates to btf_encoder and bug fixes
+- Remove upstreamed patches
+ - btf_encoder-fix-and-complete-filtering-out-zero-sized-per-CPU-variables.patch
+ - remove-ftrace-filter.patch
+- Pretend version 1.22 to make kernel happy
+ + dwarves-Prep-1.22.patch
+
-------------------------------------------------------------------
Wed Jun 2 14:05:24 UTC 2021 - Dirk Müller
diff --git a/dwarves.spec b/dwarves.spec
index ab5bcff..f0460ed 100644
--- a/dwarves.spec
+++ b/dwarves.spec
@@ -17,7 +17,7 @@
Name: dwarves
-Version: 1.21
+Version: 1.21+git175.1ef87b2
Release: 0
Summary: DWARF utilities
License: GPL-2.0-only
@@ -25,15 +25,16 @@ Group: Development/Tools/Debuggers
URL: https://acmel.wordpress.com/
#Git-Clone: git://git.kernel.org/pub/scm/devel/pahole/pahole
#Git-Web: http://git.kernel.org/cgit/devel/pahole/pahole.git
-Source: https://fedorapeople.org/~acme/dwarves/dwarves-%version.tar.xz
-Source2: https://fedorapeople.org/~acme/dwarves/dwarves-%version.tar.sign
+Source: %{name}-%{version}.tar.xz
+#Source: https://fedorapeople.org/~acme/dwarves/dwarves-%version.tar.xz
+#Source2: https://fedorapeople.org/~acme/dwarves/dwarves-%version.tar.sign
Source9: baselibs.conf
-Patch0: remove-ftrace-filter.patch
-Patch1: btf_encoder-fix-and-complete-filtering-out-zero-sized-per-CPU-variables.patch
+Patch0: dwarves-Prep-1.22.patch
BuildRequires: cmake
BuildRequires: libdw-devel >= 0.171
BuildRequires: libelf-devel
BuildRequires: pkgconfig
+BuildRequires: pkgconfig(libbpf)
BuildRequires: pkgconfig(zlib)
# Also known by its most prominent tool
Provides: pahole = %version-%release
@@ -90,7 +91,8 @@ for processing DWARF, a debugging data format for ELF files.
%build
sv="$PWD/lib.v"
-echo "DWARVES_%version { global: *; };" >"$sv"
+ver=$(echo %version | cut -d+ -f1)
+echo "DWARVES_$ver{ global: *; };" >"$sv"
%cmake -DCMAKE_SHARED_LINKER_FLAGS:STRING="-Wl,--version-script=$sv"
%cmake_build
diff --git a/remove-ftrace-filter.patch b/remove-ftrace-filter.patch
deleted file mode 100644
index 28aa283..0000000
--- a/remove-ftrace-filter.patch
+++ /dev/null
@@ -1,343 +0,0 @@
-From: Jiri Slaby
-Date: Tue, 4 May 2021 08:09:50 +0200
-Subject: remove ftrace filter
-Patch-mainline: under discussion
-References: ppc64 kernel build failure
-
-Functions in the .opd section on ppc64 are currently ignored as they
-don't contain mcount calls -- they are excluded by the ftrace filter.
-Therefore, pahole cannot produce a .BTF section from vmlinux and kernel
-build fails on ppc64.
-
-Remove the ftrace filter completely as was discussed:
- https://lore.kernel.org/bpf/20210501001653.x3b4rk4vk4iqv3n7@kafai-mbp.dhcp.thefacebook.com/
- https://lore.kernel.org/bpf/YI%2FLgjLxo9VCN%2Fd+@krava/
-
-Signed-off-by: Jiri Slaby
----
- btf_encoder.c | 272 +-------------------------------------------------
- 1 file changed, 5 insertions(+), 267 deletions(-)
-
-diff --git a/btf_encoder.c b/btf_encoder.c
-index 80e896961d4e..ba83bb088efa 100644
---- a/btf_encoder.c
-+++ b/btf_encoder.c
-@@ -27,17 +27,8 @@
- */
- #define KSYM_NAME_LEN 128
-
--struct funcs_layout {
-- unsigned long mcount_start;
-- unsigned long mcount_stop;
-- unsigned long mcount_sec_idx;
--};
--
- struct elf_function {
- const char *name;
-- unsigned long addr;
-- unsigned long size;
-- unsigned long sh_addr;
- bool generated;
- };
-
-@@ -98,250 +89,11 @@ static int collect_function(struct btf_elf *btfe, GElf_Sym *sym,
- }
-
- functions[functions_cnt].name = name;
-- functions[functions_cnt].addr = elf_sym__value(sym);
-- functions[functions_cnt].size = elf_sym__size(sym);
-- functions[functions_cnt].sh_addr = sh.sh_addr;
- functions[functions_cnt].generated = false;
- functions_cnt++;
- return 0;
- }
-
--static int addrs_cmp(const void *_a, const void *_b)
--{
-- const __u64 *a = _a;
-- const __u64 *b = _b;
--
-- if (*a == *b)
-- return 0;
-- return *a < *b ? -1 : 1;
--}
--
--static int get_vmlinux_addrs(struct btf_elf *btfe, struct funcs_layout *fl,
-- __u64 **paddrs, __u64 *pcount)
--{
-- __u64 *addrs, count, offset;
-- unsigned int addr_size, i;
-- Elf_Data *data;
-- GElf_Shdr shdr;
-- Elf_Scn *sec;
--
-- /* Initialize for the sake of all error paths below. */
-- *paddrs = NULL;
-- *pcount = 0;
--
-- if (!fl->mcount_start || !fl->mcount_stop)
-- return 0;
--
-- /*
-- * Find mcount addressed marked by __start_mcount_loc
-- * and __stop_mcount_loc symbols and load them into
-- * sorted array.
-- */
-- sec = elf_getscn(btfe->elf, fl->mcount_sec_idx);
-- if (!sec || !gelf_getshdr(sec, &shdr)) {
-- fprintf(stderr, "Failed to get section(%lu) header.\n",
-- fl->mcount_sec_idx);
-- return -1;
-- }
--
-- /* Get address size from processed file's ELF class. */
-- addr_size = gelf_getclass(btfe->elf) == ELFCLASS32 ? 4 : 8;
--
-- offset = fl->mcount_start - shdr.sh_addr;
-- count = (fl->mcount_stop - fl->mcount_start) / addr_size;
--
-- data = elf_getdata(sec, 0);
-- if (!data) {
-- fprintf(stderr, "Failed to get section(%lu) data.\n",
-- fl->mcount_sec_idx);
-- return -1;
-- }
--
-- addrs = malloc(count * sizeof(addrs[0]));
-- if (!addrs) {
-- fprintf(stderr, "Failed to allocate memory for ftrace addresses.\n");
-- return -1;
-- }
--
-- if (addr_size == sizeof(__u64)) {
-- memcpy(addrs, data->d_buf + offset, count * addr_size);
-- } else {
-- for (i = 0; i < count; i++)
-- addrs[i] = (__u64) *((__u32 *) (data->d_buf + offset + i * addr_size));
-- }
--
-- *paddrs = addrs;
-- *pcount = count;
-- return 0;
--}
--
--static int
--get_kmod_addrs(struct btf_elf *btfe, __u64 **paddrs, __u64 *pcount)
--{
-- __u64 *addrs, count;
-- unsigned int addr_size, i;
-- GElf_Shdr shdr_mcount;
-- Elf_Data *data;
-- Elf_Scn *sec;
--
-- /* Initialize for the sake of all error paths below. */
-- *paddrs = NULL;
-- *pcount = 0;
--
-- /* get __mcount_loc */
-- sec = elf_section_by_name(btfe->elf, &btfe->ehdr, &shdr_mcount,
-- "__mcount_loc", NULL);
-- if (!sec) {
-- if (btf_elf__verbose) {
-- printf("%s: '%s' doesn't have __mcount_loc section\n", __func__,
-- btfe->filename);
-- }
-- return 0;
-- }
--
-- data = elf_getdata(sec, NULL);
-- if (!data) {
-- fprintf(stderr, "Failed to data for __mcount_loc section.\n");
-- return -1;
-- }
--
-- /* Get address size from processed file's ELF class. */
-- addr_size = gelf_getclass(btfe->elf) == ELFCLASS32 ? 4 : 8;
--
-- count = data->d_size / addr_size;
--
-- addrs = malloc(count * sizeof(addrs[0]));
-- if (!addrs) {
-- fprintf(stderr, "Failed to allocate memory for ftrace addresses.\n");
-- return -1;
-- }
--
-- if (addr_size == sizeof(__u64)) {
-- memcpy(addrs, data->d_buf, count * addr_size);
-- } else {
-- for (i = 0; i < count; i++)
-- addrs[i] = (__u64) *((__u32 *) (data->d_buf + i * addr_size));
-- }
--
-- /*
-- * We get Elf object from dwfl_module_getelf function,
-- * which performs all possible relocations, including
-- * __mcount_loc section.
-- *
-- * So addrs array now contains relocated values, which
-- * we need take into account when we compare them to
-- * functions values, see comment in setup_functions
-- * function.
-- */
-- *paddrs = addrs;
-- *pcount = count;
-- return 0;
--}
--
--static int is_ftrace_func(struct elf_function *func, __u64 *addrs, __u64 count)
--{
-- __u64 start = func->addr;
-- __u64 addr, end = func->addr + func->size;
--
-- /*
-- * The invariant here is addr[r] that is the smallest address
-- * that is >= than function start addr. Except the corner case
-- * where there is no such r, but for that we have a final check
-- * in the return.
-- */
-- size_t l = 0, r = count - 1, m;
--
-- /* make sure we don't use invalid r */
-- if (count == 0)
-- return false;
--
-- while (l < r) {
-- m = l + (r - l) / 2;
-- addr = addrs[m];
--
-- if (addr >= start) {
-- /* we satisfy invariant, so tighten r */
-- r = m;
-- } else {
-- /* m is not good enough as l, maybe m + 1 will be */
-- l = m + 1;
-- }
-- }
--
-- return start <= addrs[r] && addrs[r] < end;
--}
--
--static int setup_functions(struct btf_elf *btfe, struct funcs_layout *fl)
--{
-- __u64 *addrs, count, i;
-- int functions_valid = 0;
-- bool kmod = false;
--
-- /*
-- * Check if we are processing vmlinux image and
-- * get mcount data if it's detected.
-- */
-- if (get_vmlinux_addrs(btfe, fl, &addrs, &count))
-- return -1;
--
-- /*
-- * Check if we are processing kernel module and
-- * get mcount data if it's detected.
-- */
-- if (!addrs) {
-- if (get_kmod_addrs(btfe, &addrs, &count))
-- return -1;
-- kmod = true;
-- }
--
-- if (!addrs) {
-- if (btf_elf__verbose)
-- printf("ftrace symbols not detected, falling back to DWARF data\n");
-- delete_functions();
-- return 0;
-- }
--
-- qsort(addrs, count, sizeof(addrs[0]), addrs_cmp);
-- qsort(functions, functions_cnt, sizeof(functions[0]), functions_cmp);
--
-- /*
-- * Let's got through all collected functions and filter
-- * out those that are not in ftrace.
-- */
-- for (i = 0; i < functions_cnt; i++) {
-- struct elf_function *func = &functions[i];
-- /*
-- * For vmlinux image both addrs[x] and functions[x]::addr
-- * values are final address and are comparable.
-- *
-- * For kernel module addrs[x] is final address, but
-- * functions[x]::addr is relative address within section
-- * and needs to be relocated by adding sh_addr.
-- */
-- if (kmod)
-- func->addr += func->sh_addr;
--
-- /* Make sure function is within ftrace addresses. */
-- if (is_ftrace_func(func, addrs, count)) {
-- /*
-- * We iterate over sorted array, so we can easily skip
-- * not valid item and move following valid field into
-- * its place, and still keep the 'new' array sorted.
-- */
-- if (i != functions_valid)
-- functions[functions_valid] = functions[i];
-- functions_valid++;
-- }
-- }
--
-- functions_cnt = functions_valid;
-- free(addrs);
--
-- if (btf_elf__verbose)
-- printf("Found %d functions!\n", functions_cnt);
-- return 0;
--}
--
- static struct elf_function *find_function(const struct btf_elf *btfe,
- const char *name)
- {
-@@ -620,23 +372,8 @@ static int collect_percpu_var(struct btf_elf *btfe, GElf_Sym *sym,
- return 0;
- }
-
--static void collect_symbol(GElf_Sym *sym, struct funcs_layout *fl,
-- size_t sym_sec_idx)
--{
-- if (!fl->mcount_start &&
-- !strcmp("__start_mcount_loc", elf_sym__name(sym, btfe->symtab))) {
-- fl->mcount_start = sym->st_value;
-- fl->mcount_sec_idx = sym_sec_idx;
-- }
--
-- if (!fl->mcount_stop &&
-- !strcmp("__stop_mcount_loc", elf_sym__name(sym, btfe->symtab)))
-- fl->mcount_stop = sym->st_value;
--}
--
- static int collect_symbols(struct btf_elf *btfe, bool collect_percpu_vars)
- {
-- struct funcs_layout fl = { };
- Elf32_Word sym_sec_idx;
- uint32_t core_id;
- GElf_Sym sym;
-@@ -650,7 +387,6 @@ static int collect_symbols(struct btf_elf *btfe, bool collect_percpu_vars)
- return -1;
- if (collect_function(btfe, &sym, sym_sec_idx))
- return -1;
-- collect_symbol(&sym, &fl, sym_sec_idx);
- }
-
- if (collect_percpu_vars) {
-@@ -661,9 +397,11 @@ static int collect_symbols(struct btf_elf *btfe, bool collect_percpu_vars)
- printf("Found %d per-CPU variables!\n", percpu_var_cnt);
- }
-
-- if (functions_cnt && setup_functions(btfe, &fl)) {
-- fprintf(stderr, "Failed to filter DWARF functions\n");
-- return -1;
-+ if (functions_cnt) {
-+ qsort(functions, functions_cnt, sizeof(functions[0]), functions_cmp);
-+
-+ if (btf_elf__verbose)
-+ printf("Found %d functions!\n", functions_cnt);
- }
-
- return 0;
---
-2.31.1
-