Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'tools/bpf: Enable cross-building with clang'

Jean-Philippe Brucker says:

====================

Since v1 [1], I added Quentin's acks and applied Andrii's suggestions:
* Pass CFLAGS to libbpf link in patch 3
* Substitute CLANG_CROSS_FLAGS whole in HOST_CFLAGS to avoid accidents,
patch 4

Add support for cross-building BPF tools and selftests with clang, by
passing LLVM=1 or CC=clang to make, as well as CROSS_COMPILE. A single
clang toolchain can generate binaries for multiple architectures, so
instead of having prefixes such as aarch64-linux-gnu-gcc, clang uses the
-target parameter: `clang -target aarch64-linux-gnu'.

Patch 1 adds the parameter in Makefile.include so tools can easily
support this. Patch 2 prepares for the libbpf change from patch 3 (keep
building resolve_btfids's libbpf in the host arch, when cross-building
the kernel with clang). Patches 3-6 enable cross-building BPF tools with
clang.

[1] https://lore.kernel.org/bpf/20211122192019.1277299-1-jean-philippe@linaro.org/
====================

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>

+28 -14
+7 -6
tools/bpf/bpftool/Makefile
··· 57 57 $(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT) 58 58 $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \ 59 59 DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR) prefix= \ 60 - ARCH= CC=$(HOSTCC) LD=$(HOSTLD) $@ install_headers 60 + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) $@ install_headers 61 61 62 62 $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR) 63 63 $(call QUIET_INSTALL, $@) ··· 152 152 SRCS += $(BFD_SRCS) 153 153 endif 154 154 155 + HOST_CFLAGS = $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),\ 156 + $(subst $(CLANG_CROSS_FLAGS),,$(CFLAGS))) 157 + 155 158 BPFTOOL_BOOTSTRAP := $(BOOTSTRAP_OUTPUT)bpftool 156 159 157 160 BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o xlated_dumper.o btf_dumper.o disasm.o) ··· 205 202 CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS) 206 203 207 204 $(BOOTSTRAP_OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c 208 - $(QUIET_CC)$(HOSTCC) $(CFLAGS) -c -MMD $< -o $@ 205 + $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@ 209 206 210 207 $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c 211 208 $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@ ··· 216 213 endif 217 214 218 215 $(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP) 219 - $(QUIET_LINK)$(HOSTCC) $(CFLAGS) $(LDFLAGS) $(BOOTSTRAP_OBJS) $(LIBS_BOOTSTRAP) -o $@ 216 + $(QUIET_LINK)$(HOSTCC) $(HOST_CFLAGS) $(LDFLAGS) $(BOOTSTRAP_OBJS) $(LIBS_BOOTSTRAP) -o $@ 220 217 221 218 $(OUTPUT)bpftool: $(OBJS) $(LIBBPF) 222 219 $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ 223 220 224 221 $(BOOTSTRAP_OUTPUT)%.o: %.c $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS) | $(BOOTSTRAP_OUTPUT) 225 - $(QUIET_CC)$(HOSTCC) \ 226 - $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),$(CFLAGS)) \ 227 - -c -MMD $< -o $@ 222 + $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@ 228 223 229 224 $(OUTPUT)%.o: %.c 230 225 $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@
+1
tools/bpf/resolve_btfids/Makefile
··· 19 19 LD = $(HOSTLD) 20 20 ARCH = $(HOSTARCH) 21 21 RM ?= rm 22 + CROSS_COMPILE = 22 23 23 24 OUTPUT ?= $(srctree)/tools/bpf/resolve_btfids/ 24 25
+2 -2
tools/bpf/runqslower/Makefile
··· 12 12 BPF_DESTDIR := $(BPFOBJ_OUTPUT) 13 13 BPF_INCLUDE := $(BPF_DESTDIR)/include 14 14 INCLUDES := -I$(OUTPUT) -I$(BPF_INCLUDE) -I$(abspath ../../include/uapi) 15 - CFLAGS := -g -Wall 15 + CFLAGS := -g -Wall $(CLANG_CROSS_FLAGS) 16 16 17 17 # Try to detect best kernel BTF source 18 18 KERNEL_REL := $(shell uname -r) ··· 88 88 89 89 $(DEFAULT_BPFTOOL): $(BPFOBJ) | $(BPFTOOL_OUTPUT) 90 90 $(Q)$(MAKE) $(submake_extras) -C ../bpftool OUTPUT=$(BPFTOOL_OUTPUT) \ 91 - CC=$(HOSTCC) LD=$(HOSTLD) 91 + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD)
+2 -1
tools/lib/bpf/Makefile
··· 90 90 override CFLAGS += $(INCLUDES) 91 91 override CFLAGS += -fvisibility=hidden 92 92 override CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 93 + override CFLAGS += $(CLANG_CROSS_FLAGS) 93 94 94 95 # flags specific for shared library 95 96 SHLIB_FLAGS := -DSHARED -fPIC ··· 163 162 $(OUTPUT)libbpf.so: $(OUTPUT)libbpf.so.$(LIBBPF_VERSION) 164 163 165 164 $(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED) $(VERSION_SCRIPT) 166 - $(QUIET_LINK)$(CC) $(LDFLAGS) \ 165 + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \ 167 166 --shared -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \ 168 167 -Wl,--version-script=$(VERSION_SCRIPT) $< -lelf -lz -o $@ 169 168 @ln -sf $(@F) $(OUTPUT)libbpf.so
+12 -1
tools/scripts/Makefile.include
··· 87 87 88 88 ifeq ($(CC_NO_CLANG), 1) 89 89 EXTRA_WARNINGS += -Wstrict-aliasing=3 90 - endif 90 + 91 + else ifneq ($(CROSS_COMPILE),) 92 + CLANG_CROSS_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%)) 93 + GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)gcc)) 94 + ifneq ($(GCC_TOOLCHAIN_DIR),) 95 + CLANG_CROSS_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE)) 96 + CLANG_CROSS_FLAGS += --sysroot=$(shell $(CROSS_COMPILE)gcc -print-sysroot) 97 + CLANG_CROSS_FLAGS += --gcc-toolchain=$(realpath $(GCC_TOOLCHAIN_DIR)/..) 98 + endif # GCC_TOOLCHAIN_DIR 99 + CFLAGS += $(CLANG_CROSS_FLAGS) 100 + AFLAGS += $(CLANG_CROSS_FLAGS) 101 + endif # CROSS_COMPILE 91 102 92 103 # Hack to avoid type-punned warnings on old systems such as RHEL5: 93 104 # We should be changing CFLAGS and checking gcc version, but this
+4 -4
tools/testing/selftests/bpf/Makefile
··· 170 170 171 171 $(OUTPUT)/urandom_read: urandom_read.c 172 172 $(call msg,BINARY,,$@) 173 - $(Q)$(CC) $(LDFLAGS) $< $(LDLIBS) -Wl,--build-id=sha1 -o $@ 173 + $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $< $(LDLIBS) -Wl,--build-id=sha1 -o $@ 174 174 175 175 $(OUTPUT)/bpf_testmod.ko: $(VMLINUX_BTF) $(wildcard bpf_testmod/Makefile bpf_testmod/*.[ch]) 176 176 $(call msg,MOD,,$@) ··· 217 217 $(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \ 218 218 $(HOST_BPFOBJ) | $(HOST_BUILD_DIR)/bpftool 219 219 $(Q)$(MAKE) $(submake_extras) -C $(BPFTOOLDIR) \ 220 - CC=$(HOSTCC) LD=$(HOSTLD) \ 220 + ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) \ 221 221 EXTRA_CFLAGS='-g -O0' \ 222 222 OUTPUT=$(HOST_BUILD_DIR)/bpftool/ \ 223 223 LIBBPF_OUTPUT=$(HOST_BUILD_DIR)/libbpf/ \ ··· 248 248 $(APIDIR)/linux/bpf.h \ 249 249 | $(HOST_BUILD_DIR)/libbpf 250 250 $(Q)$(MAKE) $(submake_extras) -C $(BPFDIR) \ 251 - EXTRA_CFLAGS='-g -O0' \ 251 + EXTRA_CFLAGS='-g -O0' ARCH= CROSS_COMPILE= \ 252 252 OUTPUT=$(HOST_BUILD_DIR)/libbpf/ CC=$(HOSTCC) LD=$(HOSTLD) \ 253 253 DESTDIR=$(HOST_SCRATCH_DIR)/ prefix= all install_headers 254 254 endif ··· 551 551 $(OUTPUT)/bench_bpf_loop.o \ 552 552 $(OUTPUT)/bench_strncmp.o 553 553 $(call msg,BINARY,,$@) 554 - $(Q)$(CC) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@ 554 + $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@ 555 555 556 556 EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(SCRATCH_DIR) $(HOST_SCRATCH_DIR) \ 557 557 prog_tests/tests.h map_tests/tests.h verifier/tests.h \