On Thu, Jun 03, 2021 at 10:50:08AM -0700, Andrii Nakryiko wrote: > On Thu, Jun 3, 2021 at 10:06 AM Jean-Philippe Brucker > <jean-philippe@xxxxxxxxxx> wrote: > > > > When the bootstrap and final bpftool have different architectures, we > > need to build two distinct disasm.o objects. Add a recipe for the > > bootstrap disasm.o > > > > Fixes: d510296d331a ("bpftool: Use syscall/loader program in "prog load" and "gen skeleton" command.") > > Did this commit break something specifically? Yes, cross-building bpftool doesn't work anymore, because the bootstrap bpftool is linked using objects from different architectures: $ make O=/tmp/bpftool ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -C tools/bpf/bpftool/ V=1 aarch64-linux-gnu-gcc ... -c -MMD -o /tmp/bpftool/disasm.o /home/z/src/linux/kernel/bpf/disasm.c gcc ... -c -MMD -o /tmp/bpftool//bootstrap/main.o main.c gcc ... -o /tmp/bpftool//bootstrap/bpftool /tmp/bpftool//bootstrap/main.o ... /tmp/bpftool/disasm.o /usr/bin/ld: /tmp/bpftool/disasm.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/bpftool/disasm.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/bpftool/disasm.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/bpftool/disasm.o: error adding symbols: file in wrong format collect2: error: ld returned 1 exit status The final bpftool is built for arm64, while the bootstrap bpftool, executed on the host, is built for x86. The problem here is that disasm.o linked into the bootstrap bpftool is arm64 rather than x86. With my fix we build two disasm.o, one for the target bpftool in arm64, and one for the bootstrap bpftool in x86. > > Signed-off-by: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> > > --- > > tools/bpf/bpftool/Makefile | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile > > index d16d289ade7a..d73232be1e99 100644 > > --- a/tools/bpf/bpftool/Makefile > > +++ b/tools/bpf/bpftool/Makefile > > @@ -136,7 +136,7 @@ endif > > > > BPFTOOL_BOOTSTRAP := $(BOOTSTRAP_OUTPUT)bpftool > > > > -BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o xlated_dumper.o btf_dumper.o) $(OUTPUT)disasm.o > > +BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o xlated_dumper.o btf_dumper.o disasm.o) > > OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o > > > > VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \ > > @@ -180,6 +180,9 @@ endif > > > > CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS) > > > > +$(BOOTSTRAP_OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c > > + $(QUIET_CC)$(HOSTCC) $(CFLAGS) -c -MMD -o $@ $< > > + > > $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c > > maybe just do > > $(BOOTSTRAP_OUTPUT)disasm.o $(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c They need two different recipes. The bootstrap disasm.o needs to be built with $(HOSTCC) rather than $(CC) (CC=aarch64-linux-gnu-gcc and HOSTCC=gcc) Thanks, Jean > ? > > > $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $< > > > > -- > > 2.31.1 > >