On 05/09/2023 16:12, Hengqi Chen wrote: > Dynamic symbols in shared library may have the same name, for example: > > $ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep rwlock_wrlock > 000000000009b1a0 T __pthread_rwlock_wrlock@GLIBC_2.2.5 > 000000000009b1a0 T pthread_rwlock_wrlock@@GLIBC_2.34 > 000000000009b1a0 T pthread_rwlock_wrlock@GLIBC_2.2.5 > > $ readelf -W --dyn-syms /lib/x86_64-linux-gnu/libc.so.6 | grep rwlock_wrlock > 706: 000000000009b1a0 878 FUNC GLOBAL DEFAULT 15 __pthread_rwlock_wrlock@GLIBC_2.2.5 > 2568: 000000000009b1a0 878 FUNC GLOBAL DEFAULT 15 pthread_rwlock_wrlock@@GLIBC_2.34 > 2571: 000000000009b1a0 878 FUNC GLOBAL DEFAULT 15 pthread_rwlock_wrlock@GLIBC_2.2.5 > > Currently, users can't attach a uprobe to pthread_rwlock_wrlock because > there are two symbols named pthread_rwlock_wrlock and both are global > bind. And libbpf considers it as a conflict. > > Since both of them are at the same offset we could accept one of them > harmlessly. Note that we already does this in elf_resolve_syms_offsets. > > Signed-off-by: Hengqi Chen <hengqi.chen@xxxxxxxxx> Reviewed-by: Alan Maguire <alan.maguire@xxxxxxxxxx> > --- > tools/lib/bpf/elf.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/tools/lib/bpf/elf.c b/tools/lib/bpf/elf.c > index 9d0296c1726a..5c9e588b17da 100644 > --- a/tools/lib/bpf/elf.c > +++ b/tools/lib/bpf/elf.c > @@ -214,7 +214,10 @@ long elf_find_func_offset(Elf *elf, const char *binary_path, const char *name) > > if (ret > 0) { > /* handle multiple matches */ > - if (last_bind != STB_WEAK && cur_bind != STB_WEAK) { > + if (elf_sym_offset(sym) == ret) { > + /* same offset, no problem */ > + continue; > + } else if (last_bind != STB_WEAK && cur_bind != STB_WEAK) { > /* Only accept one non-weak bind. */ > pr_warn("elf: ambiguous match for '%s', '%s' in '%s'\n", > sym->name, name, binary_path); > -- > 2.34.1