| From b9d662527b1174dc6498b120be3db58c6950582d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 4 Feb 2022 13:43:55 -0800 |
| Subject: libbpf: Fix build issue with llvm-readelf |
| |
| From: Yonghong Song <yhs@fb.com> |
| |
| [ Upstream commit 0908a66ad1124c1634c33847ac662106f7f2c198 ] |
| |
| 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: Delyan Kratunov <delyank@fb.com> |
| Signed-off-by: Yonghong Song <yhs@fb.com> |
| Signed-off-by: Andrii Nakryiko <andrii@kernel.org> |
| Link: https://lore.kernel.org/bpf/20220204214355.502108-1-yhs@fb.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| tools/lib/bpf/Makefile | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/tools/lib/bpf/Makefile |
| +++ b/tools/lib/bpf/Makefile |
| @@ -129,7 +129,7 @@ GLOBAL_SYM_COUNT = $(shell readelf -s -- |
| sort -u | wc -l) |
| VERSIONED_SYM_COUNT = $(shell readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \ |
| sed 's/\[.*\]//' | \ |
| - awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \ |
| + awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}' | \ |
| grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l) |
| |
| CMD_TARGETS = $(LIB_TARGET) $(PC_FILE) |
| @@ -192,7 +192,7 @@ check_abi: $(OUTPUT)libbpf.so $(VERSION_ |
| sort -u > $(OUTPUT)libbpf_global_syms.tmp; \ |
| readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \ |
| sed 's/\[.*\]//' | \ |
| - awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'| \ |
| + awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}'| \ |
| grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | \ |
| sort -u > $(OUTPUT)libbpf_versioned_syms.tmp; \ |
| diff -u $(OUTPUT)libbpf_global_syms.tmp \ |