From ad939be5a6187db02c368cac58d318076bb1493f Mon Sep 17 00:00:00 2001 From: ChoKyuWon Date: Sat, 16 Sep 2023 03:46:33 +0900 Subject: [PATCH] symbol:Fix `load_dynsymtab` to support no-plt `load_dynsymtab` only loaded the dynamic symbols from `dynsym` and PLTs(`.rel(a).plt` and `.plt`). this commit fixes it to call the `arch_load_dynsymtab_noplt` in the `load_dynsymtab`, so it also loads the dynamic symbols from the `rel(a).dyn`, which normally saves the symbols in case of no-plt option. Signed-off-by: ChoKyuWon --- arch/x86_64/symbol.c | 1 + utils/symbol.c | 43 +++++++++++++++++++++++-------------------- utils/symbol.h | 1 + 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/arch/x86_64/symbol.c b/arch/x86_64/symbol.c index d3c868d24..d0d59d53d 100644 --- a/arch/x86_64/symbol.c +++ b/arch/x86_64/symbol.c @@ -92,6 +92,7 @@ int arch_load_dynsymtab_noplt(struct uftrace_symtab *dsymtab, struct uftrace_elf pr_dbg3("[%zd] %c %lx + %-5u %s\n", dsymtab->nr_sym, sym->type, sym->addr, sym->size, sym->name); } + sort_dynsymtab(dsymtab); return dsymtab->nr_sym; } diff --git a/utils/symbol.c b/utils/symbol.c index 3705c825c..b29719bc1 100644 --- a/utils/symbol.c +++ b/utils/symbol.c @@ -472,10 +472,11 @@ static int load_dyn_symbol(struct uftrace_symtab *dsymtab, int sym_idx, unsigned return 1; } -static void sort_dynsymtab(struct uftrace_symtab *dsymtab) +void sort_dynsymtab(struct uftrace_symtab *dsymtab) { unsigned i, k; - + if (dsymtab->nr_sym == 0) + return; dsymtab->nr_alloc = dsymtab->nr_sym; dsymtab->sym = xrealloc(dsymtab->sym, dsymtab->nr_sym * sizeof(*dsymtab->sym)); @@ -643,24 +644,6 @@ int load_elf_dynsymtab(struct uftrace_symtab *dsymtab, struct uftrace_elf_data * return ret; } -static int load_dynsymtab(struct uftrace_symtab *dsymtab, const char *filename, - unsigned long offset, unsigned long flags) -{ - int ret; - struct uftrace_elf_data elf; - - if (elf_init(filename, &elf) < 0) { - pr_dbg("error during open symbol file: %s: %m\n", filename); - return -1; - } - - pr_dbg3("loading dynamic symbols from %s (offset: %#lx)\n", filename, offset); - ret = load_elf_dynsymtab(dsymtab, &elf, offset, flags); - - elf_finish(&elf); - return ret; -} - static void merge_symtabs(struct uftrace_symtab *left, struct uftrace_symtab *right) { size_t nr_sym = left->nr_sym + right->nr_sym; @@ -714,6 +697,26 @@ static void merge_symtabs(struct uftrace_symtab *left, struct uftrace_symtab *ri left->name_sorted = true; } +static int load_dynsymtab(struct uftrace_symtab *dsymtab, const char *filename, + unsigned long offset, unsigned long flags) +{ + struct uftrace_symtab dsymtab_noplt = {}; + struct uftrace_elf_data elf; + + if (elf_init(filename, &elf) < 0) { + pr_dbg("error during open symbol file: %s: %m\n", filename); + return -1; + } + + pr_dbg3("loading dynamic symbols from %s (offset: %#lx)\n", filename, offset); + load_elf_dynsymtab(dsymtab, &elf, offset, flags); + arch_load_dynsymtab_noplt(&dsymtab_noplt, &elf, offset, flags); + merge_symtabs(dsymtab, &dsymtab_noplt); + + elf_finish(&elf); + return dsymtab->nr_sym; +} + static int update_symtab_using_dynsym(struct uftrace_symtab *symtab, const char *filename, unsigned long offset, unsigned long flags) { diff --git a/utils/symbol.h b/utils/symbol.h index 3aae97336..c282184ca 100644 --- a/utils/symbol.h +++ b/utils/symbol.h @@ -162,6 +162,7 @@ struct uftrace_module *load_module_symtab(struct uftrace_sym_info *sinfo, const char *build_id); void save_module_symtabs(const char *dirname); void unload_module_symtabs(void); +void sort_dynsymtab(struct uftrace_symtab *dsymtab); enum uftrace_trace_type { TRACE_ERROR = -1,