• Hengqi Chen's avatar
    libbpf: Support symbol versioning for uprobe · bb7fa093
    Hengqi Chen authored
    In current implementation, we assume that symbol found in .dynsym section
    would have a version suffix and use it to compare with symbol user supplied.
    According to the spec ([0]), this assumption is incorrect, the version info
    of dynamic symbols are stored in .gnu.version and .gnu.version_d sections
    of ELF objects. 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
    
    In this case, specify pthread_rwlock_wrlock@@GLIBC_2.34 or
    pthread_rwlock_wrlock@GLIBC_2.2.5 in bpf_uprobe_opts::func_name won't work.
    Because the qualified name does NOT match `pthread_rwlock_wrlock` (without
    version suffix) in .dynsym sections.
    
    This commit implements the symbol versioning for dynsym and allows user to
    specify symbol in the following forms:
      - func
      - func@LIB_VERSION
      - func@@LIB_VERSION
    
    In case of symbol conflicts, error out and users should resolve it by
    specifying a qualified name.
    
      [0]: https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/symversion.htmlSigned-off-by: default avatarHengqi Chen <hengqi.chen@gmail.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Reviewed-by: default avatarAlan Maguire <alan.maguire@oracle.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Link: https://lore.kernel.org/bpf/20230918024813.237475-3-hengqi.chen@gmail.com
    bb7fa093
libbpf.c 353 KB