[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aW--GBGlZ6FH2m8P@laps>
Date: Tue, 20 Jan 2026 12:40:40 -0500
From: Sasha Levin <sashal@...nel.org>
To: Peter Zijlstra <peterz@...radead.org>
Cc: "Rafael J. Wysocki" <rafael@...nel.org>,
Josh Poimboeuf <jpoimboe@...hat.com>,
Arnaldo Carvalho de Melo <acme@...nel.org>,
the arch/x86 maintainers <x86@...nel.org>,
Linus Torvalds <torvalds@...ux-foundation.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Linux regressions mailing list <regressions@...ts.linux.dev>,
irogers@...gle.com
Subject: Re: [Regression in 6.19-rc6] Build breakage after commit 436326bc525d
On Tue, Jan 20, 2026 at 11:28:32AM +0100, Peter Zijlstra wrote:
>On Mon, Jan 19, 2026 at 09:19:31PM +0100, Rafael J. Wysocki wrote:
>> Hi Sasha,
>>
>> Commit 436326bc525d ("objtool: fix build failure due to missing
>> libopcodes check") breaks kernel build for me.
>>
>> Here's what I get when I try to build the kernel after that commit:
>>
>> LD /scratch/rafael/work/build/xps13/tools/objtool/objtool-in.o
>> LINK /scratch/rafael/work/build/xps13/tools/objtool/objtool
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../x86_64-suse-linux/bin/ld:
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../lib64/libopcodes.a(aarch64-dis.o):
>> in function `print_operands':
>> /home/abuild/rpmbuild/BUILD/binutils-2.45/build-dir/opcodes/../../opcodes/aarch64-dis.c:3945:(.text+0x6317):
>> undefined reference to `xmalloc'
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../x86_64-suse-linux/bin/ld:
>> /home/abuild/rpmbuild/BUILD/binutils-2.45/build-dir/opcodes/../../opcodes/aarch64-dis.c:3992:(.text+0x6723):
>> undefined reference to `_sch_istable'
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../x86_64-suse-linux/bin/ld:
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../lib64/libopcodes.a(aarch64-dis.o):
>> in function `print_insn_aarch64':
>> /home/abuild/rpmbuild/BUILD/binutils-2.45/build-dir/opcodes/../../opcodes/aarch64-dis.c:4559:(.text+0x6b1e):
>> undefined reference to `bfd_get_bits'
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../x86_64-suse-linux/bin/ld:
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../lib64/libopcodes.a(aarch64-dis.o):
>> in function `parse_aarch64_dis_option':
>> /home/abuild/rpmbuild/BUILD/binutils-2.45/build-dir/opcodes/../../opcodes/aarch64-dis.c:103:(.text+0x6dea):
>> undefined reference to `_bfd_error_handler'
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../x86_64-suse-linux/bin/ld:
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../lib64/libopcodes.a(aarch64-opc.o):
>> in function `init_insn_sequence':
>> /home/abuild/rpmbuild/BUILD/binutils-2.45/build-dir/opcodes/../../opcodes/aarch64-opc.c:5561:(.text+0x5c06):
>> undefined reference to `xcalloc'
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../x86_64-suse-linux/bin/ld:
>> /usr/lib64/gcc/x86_64-suse-linux/15/../../../../lib64/libopcodes.a(disassemble.o):
>> in function `remove_whitespace_and_extra_commas':
>> /home/abuild/rpmbuild/BUILD/binutils-2.45/build-dir/opcodes/../../opcodes/disassemble.c:801:(.text+0x346):
>> undefined reference to `_sch_istable'
>> ...
>>
>> (many more similar messages skipped).
>>
>> Reverting commit 436326bc525d makes the problem go away.
Thanks for the report Rafael!
Could you confirm that you're linking against static libraries? I haven't
tested that scenario.
>Bah, I hate makefiles.
>
>Anyway, the below is that revert + adding an explicit libbfd-opcodes
>feature test.
If the issue is indeed static libs, then I don't think that the below would
work.
I think that we need to explicitly list out all the dependencies rather than
just -lopcodes.
With only -lopcodes:
$ echo '#include <dis-asm.h>
int main(void) { disassemble_init_for_target(NULL); return 0; }' | gcc -xc - -DPACKAGE='"test"' -lopcodes -o /tmp/test
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/15/../../../x86_64-linux-gnu/libopcodes.a(i386-dis.o): warning: relocation against `_sch_istable' in read-only section `.text'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/15/../../../x86_64-linux-gnu/libopcodes.a(i386-dis.o): in function `i386_dis_printf':
./builddir-single/opcodes/../../opcodes/i386-dis.c:9675:(.text+0x673): undefined reference to `_sch_istable'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/15/../../../x86_64-linux-gnu/libopcodes.a(i386-dis.o): in function `putop':
./builddir-single/opcodes/../../opcodes/i386-dis.c:10825:(.text+0x8f65): undefined reference to `_sch_istable'
/usr/bin/ld: ./builddir-single/opcodes/../../opcodes/i386-dis.c:11075:(.text+0x9eb1): undefined reference to `_sch_istable'
/usr/bin/ld: ./builddir-single/opcodes/../../opcodes/i386-dis.c:10919:(.text+0xa007): undefined reference to `_sch_istable'
/usr/bin/ld: ./builddir-single/opcodes/../../opcodes/i386-dis.c:11002:(.text+0xa190): undefined reference to `_sch_istable'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/15/../../../x86_64-linux-gnu/libopcodes.a(i386-dis.o):./builddir-single/opcodes/../../opcodes/i386-dis.c:11071: more undefined references to `_sch_istable' follow
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/15/../../../x86_64-linux-gnu/libopcodes.a(disassemble.o): in function `opcodes_assert':
./builddir-single/opcodes/../../opcodes/disassemble.c:856:(.text+0x2ae): undefined reference to `_bfd_error_handler'
/usr/bin/ld: ./builddir-single/opcodes/../../opcodes/disassemble.c:857:(.text+0x2d0): undefined reference to `_bfd_error_handler'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
With the rest of the dependencies:
$ echo '#include <dis-asm.h>
int main(void) { disassemble_init_for_target(NULL); return 0; }' | gcc -xc - -DPACKAGE='"test"' -lopcodes -lbfd -liberty -lz -o /tmp/test
$ echo $?
0
But I'm not sure how we determine what the dependencies are exactly without
trying all the various combinations of them...
The below patch also brings back the cross compilation issue that originally
prompted my patch (see
https://qa-reports.linaro.org/lkft/sashal-linus-next/build/v6.18-rc7-14082-gef67311bf79e/testrun/30638724/suite/build/test/gcc-14-ppc6xx_defconfig/log)
>Did I do this right? Josh, Arnaldo, could you comment on that CC vs
>HOSTCC issue that Sasha mentioned?
>
>---
>diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
>index 362cf8f4a0a0..4d93375a6474 100644
>--- a/tools/build/Makefile.feature
>+++ b/tools/build/Makefile.feature
>@@ -117,6 +117,7 @@ FEATURE_TESTS_EXTRA := \
> libcapstone \
> libbfd-liberty \
> libbfd-liberty-z \
>+ libbfd-opcodes \
> libopencsd \
> libperl \
> cxx \
>diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
>index 0d5a15654b17..4a9fc7a1b2ed 100644
>--- a/tools/build/feature/Makefile
>+++ b/tools/build/feature/Makefile
>@@ -19,6 +19,7 @@ FILES= \
> test-reallocarray.bin \
> test-libbfd-liberty.bin \
> test-libbfd-liberty-z.bin \
>+ test-libbfd-opcodes.bin \
> test-cplus-demangle.bin \
> test-cxa-demangle.bin \
> test-libcap.bin \
>@@ -288,6 +289,9 @@ endif
> $(OUTPUT)test-libbfd-liberty-z.bin:
> $(CC) $(CFLAGS) -Wall -Werror -o $@ test-libbfd.c -DPACKAGE='"perf"' $(LDFLAGS) -lbfd -ldl -liberty -lz
>
>+$(OUTPUT)test-libbfd-opcodes.bin:
>+ $(CC) $(CFLAGS) -Wall -Werror -o $@ test-libbfd.c $(LDFLAGS) -lbfd -ldl -lopcodes
>+
> $(OUTPUT)test-cplus-demangle.bin:
> $(BUILD) -liberty
>
>diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile
>index 9b4503113ce5..5b85652cbfd7 100644
>--- a/tools/objtool/Makefile
>+++ b/tools/objtool/Makefile
>@@ -72,27 +72,23 @@ HOST_OVERRIDES := CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)"
>
> #
> # To support disassembly, objtool needs libopcodes which is provided
>-# with libbfd (binutils-dev or binutils-devel package).
>+# with libbdf (binutils-dev or binutils-devel package).
> #
>-# We check using HOSTCC directly rather than the shared feature framework
>-# because objtool is a host tool that links against host libraries.
>-#
>-HAVE_LIBOPCODES := $(shell echo 'int main(void) { return 0; }' | \
>- $(HOSTCC) -xc - -o /dev/null -lopcodes 2>/dev/null && echo y)
>+FEATURE_USER = .objtool
>+FEATURE_TESTS = libbfd-opcodes disassembler-init-styled
>+FEATURE_DISPLAY =
>+include $(srctree)/tools/build/Makefile.feature
>
>-# Styled disassembler support requires binutils >= 2.39
>-HAVE_DISASM_STYLED := $(shell echo '$(pound)include <dis-asm.h>' | \
>- $(HOSTCC) -E -xc - 2>/dev/null | grep -q disassembler_style && echo y)
>+ifeq ($(feature-disassembler-init-styled), 1)
>+ OBJTOOL_CFLAGS += -DDISASM_INIT_STYLED
>+endif
>
> BUILD_DISAS := n
>
>-ifeq ($(HAVE_LIBOPCODES),y)
>+ifeq ($(feature-libbfd-opcodes),1)
> BUILD_DISAS := y
>- OBJTOOL_CFLAGS += -DDISAS -DPACKAGE='"objtool"'
>+ OBJTOOL_CFLAGS += -DDISAS -DPACKAGE="objtool"
> OBJTOOL_LDFLAGS += -lopcodes
>-ifeq ($(HAVE_DISASM_STYLED),y)
>- OBJTOOL_CFLAGS += -DDISASM_INIT_STYLED
>-endif
> endif
>
> export BUILD_DISAS
--
Thanks,
Sasha
Powered by blists - more mailing lists