import dwarves-1.22-1.el9
This commit is contained in:
parent
2ecb640231
commit
fdbf968997
@ -1 +1 @@
|
||||
4bd8a111efefbf4058942e76d1193810e4ee5515 SOURCES/dwarves-1.21.tar.xz
|
||||
ca9684e13a39c9333d2c54b09d421fd65c23d951 SOURCES/dwarves-1.22.tar.xz
|
||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
SOURCES/dwarves-1.21.tar.xz
|
||||
SOURCES/dwarves-1.22.tar.xz
|
||||
|
@ -1,392 +0,0 @@
|
||||
From 58a98f76ac95b1bb11920ff2b58206b2364e6b3b Mon Sep 17 00:00:00 2001
|
||||
From: Martin KaFai Lau <kafai@fb.com>
|
||||
Date: Thu, 6 May 2021 13:56:22 -0700
|
||||
Subject: [PATCH] btf: Remove ftrace filter
|
||||
|
||||
BTF is currently generated for functions that are in ftrace list
|
||||
or extern.
|
||||
|
||||
A recent use case also needs BTF generated for functions included in
|
||||
allowlist.
|
||||
|
||||
In particular, the kernel commit:
|
||||
|
||||
e78aea8b2170 ("bpf: tcp: Put some tcp cong functions in allowlist for bpf-tcp-cc")
|
||||
|
||||
allows bpf program to directly call a few tcp cc kernel functions. Those
|
||||
kernel functions are currently allowed only if CONFIG_DYNAMIC_FTRACE
|
||||
is set to ensure they are in the ftrace list but this kconfig dependency
|
||||
is unnecessary.
|
||||
|
||||
Those kernel functions are specified under an ELF section .BTF_ids.
|
||||
There was an earlier attempt [0] to add another filter for the functions in
|
||||
the .BTF_ids section. That discussion concluded that the ftrace filter
|
||||
should be removed instead.
|
||||
|
||||
This patch is to remove the ftrace filter and its related functions.
|
||||
|
||||
Number of BTF FUNC with and without is_ftrace_func():
|
||||
My kconfig in x86: 40643 vs 46225
|
||||
Jiri reported on arm: 25022 vs 55812
|
||||
|
||||
[0]: https://lore.kernel.org/dwarves/20210423213728.3538141-1-kafai@fb.com/
|
||||
|
||||
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
|
||||
Tested-by: Nathan Chancellor <nathan@kernel.org> # build
|
||||
Acked-by: Jiri Olsa <jolsa@kernel.org>
|
||||
Acked-by: Jiri Slaby <jirislaby@kernel.org>
|
||||
Cc: Andrii Nakryiko <andrii@kernel.org>
|
||||
Cc: Jiri Olsa <jolsa@kernel.org>
|
||||
Cc: kernel-team@fb.com
|
||||
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
||||
---
|
||||
btf_encoder.c | 285 ++------------------------------------------------
|
||||
1 file changed, 7 insertions(+), 278 deletions(-)
|
||||
|
||||
diff --git a/btf_encoder.c b/btf_encoder.c
|
||||
index 80e896961d4e..c711f124b31e 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;
|
||||
};
|
||||
|
||||
@@ -64,12 +55,9 @@ static void delete_functions(void)
|
||||
#define max(x, y) ((x) < (y) ? (y) : (x))
|
||||
#endif
|
||||
|
||||
-static int collect_function(struct btf_elf *btfe, GElf_Sym *sym,
|
||||
- size_t sym_sec_idx)
|
||||
+static int collect_function(struct btf_elf *btfe, GElf_Sym *sym)
|
||||
{
|
||||
struct elf_function *new;
|
||||
- static GElf_Shdr sh;
|
||||
- static size_t last_idx;
|
||||
const char *name;
|
||||
|
||||
if (elf_sym__type(sym) != STT_FUNC)
|
||||
@@ -91,257 +79,12 @@ static int collect_function(struct btf_elf *btfe, GElf_Sym *sym,
|
||||
functions = new;
|
||||
}
|
||||
|
||||
- if (sym_sec_idx != last_idx) {
|
||||
- if (!elf_section_by_idx(btfe->elf, &sh, sym_sec_idx))
|
||||
- return 0;
|
||||
- last_idx = sym_sec_idx;
|
||||
- }
|
||||
-
|
||||
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 +363,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;
|
||||
@@ -648,9 +376,8 @@ static int collect_symbols(struct btf_elf *btfe, bool collect_percpu_vars)
|
||||
elf_symtab__for_each_symbol_index(btfe->symtab, core_id, sym, sym_sec_idx) {
|
||||
if (collect_percpu_vars && collect_percpu_var(btfe, &sym, sym_sec_idx))
|
||||
return -1;
|
||||
- if (collect_function(btfe, &sym, sym_sec_idx))
|
||||
+ if (collect_function(btfe, &sym))
|
||||
return -1;
|
||||
- collect_symbol(&sym, &fl, sym_sec_idx);
|
||||
}
|
||||
|
||||
if (collect_percpu_vars) {
|
||||
@@ -661,9 +388,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
|
||||
|
@ -2,14 +2,13 @@
|
||||
%define libver 1
|
||||
|
||||
Name: dwarves
|
||||
Version: 1.21
|
||||
Release: 2%{?dist}
|
||||
Version: 1.22
|
||||
Release: 1%{?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-btf-Remove-ftrace-filter.patch
|
||||
BuildRequires: gcc
|
||||
BuildRequires: cmake >= 2.8.12
|
||||
BuildRequires: zlib-devel
|
||||
@ -66,7 +65,6 @@ Debugging information processing library development files.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%patch1 -p1
|
||||
|
||||
%build
|
||||
%cmake -DCMAKE_BUILD_TYPE=Release .
|
||||
@ -81,7 +79,7 @@ rm -Rf %{buildroot}
|
||||
%files
|
||||
%doc README.ctracer
|
||||
%doc README.btf
|
||||
%doc changes-v1.21
|
||||
%doc changes-v1.22
|
||||
%doc NEWS
|
||||
%{_bindir}/btfdiff
|
||||
%{_bindir}/codiff
|
||||
@ -116,7 +114,6 @@ rm -Rf %{buildroot}
|
||||
%doc MANIFEST README
|
||||
%{_includedir}/dwarves/btf_encoder.h
|
||||
%{_includedir}/dwarves/config.h
|
||||
%{_includedir}/dwarves/ctf_encoder.h
|
||||
%{_includedir}/dwarves/ctf.h
|
||||
%{_includedir}/dwarves/dutil.h
|
||||
%{_includedir}/dwarves/dwarves.h
|
||||
@ -126,16 +123,34 @@ rm -Rf %{buildroot}
|
||||
%{_includedir}/dwarves/elf_symtab.h
|
||||
%{_includedir}/dwarves/gobuffer.h
|
||||
%{_includedir}/dwarves/hash.h
|
||||
%{_includedir}/dwarves/libbtf.h
|
||||
%{_includedir}/dwarves/libctf.h
|
||||
%{_includedir}/dwarves/list.h
|
||||
%{_includedir}/dwarves/rbtree.h
|
||||
%{_includedir}/dwarves/pahole_strings.h
|
||||
%{_libdir}/%{libname}.so
|
||||
%{_libdir}/%{libname}_emit.so
|
||||
%{_libdir}/%{libname}_reorganize.so
|
||||
|
||||
%changelog
|
||||
* Wed Oct 6 2021 Jiri Olsa <jolsa@redhat.com> - 1.22-1
|
||||
- New release: v1.22
|
||||
- Resolves: rhbz#2010414
|
||||
- Introduce -j/--jobs option to specify the number of threads to use.
|
||||
- Multithreaded DWARF loading, requires elfutils >= 0.178.
|
||||
- Preparatory work for multithreaded BTF encoding, the focus for 1.23.
|
||||
- Allow encoding BTF to a separate file.
|
||||
- Show all different types with the same name, not just the first one found.
|
||||
- Stop assuming that reading from stdin means pretty, add --prettify.
|
||||
- Improve type resolution for the --header command line option.
|
||||
- Do not consider the ftrace filter when encoding BTF for kernel functions.
|
||||
- Lock calls to non-thread safe elfutils' dwarf_decl_file() and dwarf_decl_line().
|
||||
- Change hash table size to one that performs better with current typical vmlinux files.
|
||||
- Allow tweaking the hash table size from the command line.
|
||||
- Add --kabi_prefix to avoid deduplication woes when using _RH_KABI_REPLACE().
|
||||
- Add --with_flexible_array to show just types with flexible arrays.
|
||||
- Support btfdiff with a detached BTF file.
|
||||
- Introduce sorted type output (--sort).
|
||||
- Disable incomplete CTF encoder.
|
||||
|
||||
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 1.21-2
|
||||
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
||||
Related: rhbz#1991688
|
||||
|
Loading…
Reference in New Issue
Block a user