• Yonghong Song's avatar
    libbpf: Fix build issue with llvm-readelf · 0908a66a
    Yonghong Song authored
    There are cases where clang compiler is packaged in a way
    readelf is a symbolic link to llvm-readelf. In such cases,
    llvm-readelf will be used instead of default binutils readelf,
    and the following error will appear during libbpf build:
    
      Warning: Num of global symbols in
       /home/yhs/work/bpf-next/tools/testing/selftests/bpf/tools/build/libbpf/sharedobjs/libbpf-in.o (367)
       does NOT match with num of versioned symbols in
       /home/yhs/work/bpf-next/tools/testing/selftests/bpf/tools/build/libbpf/libbpf.so libbpf.map (383).
       Please make sure all LIBBPF_API symbols are versioned in libbpf.map.
      --- /home/yhs/work/bpf-next/tools/testing/selftests/bpf/tools/build/libbpf/libbpf_global_syms.tmp ...
      +++ /home/yhs/work/bpf-next/tools/testing/selftests/bpf/tools/build/libbpf/libbpf_versioned_syms.tmp ...
      @@ -324,6 +324,22 @@
       btf__str_by_offset
       btf__type_by_id
       btf__type_cnt
      +LIBBPF_0.0.1
      +LIBBPF_0.0.2
      +LIBBPF_0.0.3
      +LIBBPF_0.0.4
      +LIBBPF_0.0.5
      +LIBBPF_0.0.6
      +LIBBPF_0.0.7
      +LIBBPF_0.0.8
      +LIBBPF_0.0.9
      +LIBBPF_0.1.0
      +LIBBPF_0.2.0
      +LIBBPF_0.3.0
      +LIBBPF_0.4.0
      +LIBBPF_0.5.0
      +LIBBPF_0.6.0
      +LIBBPF_0.7.0
       libbpf_attach_type_by_name
       libbpf_find_kernel_btf
       libbpf_find_vmlinux_btf_id
      make[2]: *** [Makefile:184: check_abi] Error 1
      make[1]: *** [Makefile:140: all] Error 2
    
    The above failure is due to different printouts for some ABS
    versioned symbols. For example, with the same libbpf.so,
      $ /bin/readelf --dyn-syms --wide tools/lib/bpf/libbpf.so | grep "LIBBPF" | grep ABS
         134: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  ABS LIBBPF_0.5.0
         202: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  ABS LIBBPF_0.6.0
         ...
      $ /opt/llvm/bin/readelf --dyn-syms --wide tools/lib/bpf/libbpf.so | grep "LIBBPF" | grep ABS
         134: 0000000000000000     0 OBJECT  GLOBAL DEFAULT   ABS LIBBPF_0.5.0@@LIBBPF_0.5.0
         202: 0000000000000000     0 OBJECT  GLOBAL DEFAULT   ABS LIBBPF_0.6.0@@LIBBPF_0.6.0
         ...
    The binutils readelf doesn't print out the symbol LIBBPF_* version and llvm-readelf does.
    Such a difference caused libbpf build failure with llvm-readelf.
    
    The proposed fix filters out all ABS symbols as they are not part of the comparison.
    This works for both binutils readelf and llvm-readelf.
    Reported-by: default avatarDelyan Kratunov <delyank@fb.com>
    Signed-off-by: default avatarYonghong Song <yhs@fb.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20220204214355.502108-1-yhs@fb.com
    0908a66a
Makefile 9.73 KB