libbpf: Add st_type argument to elf_resolve_syms_offsets function
authorJiri Olsa <jolsa@kernel.org>
Sat, 25 Nov 2023 19:31:25 +0000 (20:31 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 29 Nov 2023 05:50:09 +0000 (21:50 -0800)
We need to get offsets for static variables in following changes,
so making elf_resolve_syms_offsets to take st_type value as argument
and passing it to elf_sym_iter_new.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/bpf/20231125193130.834322-2-jolsa@kernel.org
tools/lib/bpf/elf.c
tools/lib/bpf/libbpf.c
tools/lib/bpf/libbpf_internal.h
tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c

index 2a62bf4..b02faec 100644 (file)
@@ -407,7 +407,8 @@ static int symbol_cmp(const void *a, const void *b)
  * size, that needs to be released by the caller.
  */
 int elf_resolve_syms_offsets(const char *binary_path, int cnt,
-                            const char **syms, unsigned long **poffsets)
+                            const char **syms, unsigned long **poffsets,
+                            int st_type)
 {
        int sh_types[2] = { SHT_DYNSYM, SHT_SYMTAB };
        int err = 0, i, cnt_done = 0;
@@ -438,7 +439,7 @@ int elf_resolve_syms_offsets(const char *binary_path, int cnt,
                struct elf_sym_iter iter;
                struct elf_sym *sym;
 
-               err = elf_sym_iter_new(&iter, elf_fd.elf, binary_path, sh_types[i], STT_FUNC);
+               err = elf_sym_iter_new(&iter, elf_fd.elf, binary_path, sh_types[i], st_type);
                if (err == -ENOENT)
                        continue;
                if (err)
index e067be9..ea9b815 100644 (file)
@@ -11447,7 +11447,7 @@ bpf_program__attach_uprobe_multi(const struct bpf_program *prog,
                        return libbpf_err_ptr(err);
                offsets = resolved_offsets;
        } else if (syms) {
-               err = elf_resolve_syms_offsets(path, cnt, syms, &resolved_offsets);
+               err = elf_resolve_syms_offsets(path, cnt, syms, &resolved_offsets, STT_FUNC);
                if (err < 0)
                        return libbpf_err_ptr(err);
                offsets = resolved_offsets;
index f0f0863..b5d3347 100644 (file)
@@ -594,7 +594,8 @@ int elf_open(const char *binary_path, struct elf_fd *elf_fd);
 void elf_close(struct elf_fd *elf_fd);
 
 int elf_resolve_syms_offsets(const char *binary_path, int cnt,
-                            const char **syms, unsigned long **poffsets);
+                            const char **syms, unsigned long **poffsets,
+                            int st_type);
 int elf_resolve_pattern_offsets(const char *binary_path, const char *pattern,
                                 unsigned long **poffsets, size_t *pcnt);
 
index cd051d3..ece260c 100644 (file)
@@ -249,7 +249,7 @@ static void __test_link_api(struct child *child)
        int link_extra_fd = -1;
        int err;
 
-       err = elf_resolve_syms_offsets(path, 3, syms, (unsigned long **) &offsets);
+       err = elf_resolve_syms_offsets(path, 3, syms, (unsigned long **) &offsets, STT_FUNC);
        if (!ASSERT_OK(err, "elf_resolve_syms_offsets"))
                return;