Skip to content

Commit 3f2de81

Browse files
Sasha LevinPeter Zijlstra
authored andcommitted
objtool: Fix libopcodes linking with static libraries
Commit 436326b ("objtool: fix build failure due to missing libopcodes check") tests for libopcodes using an empty main(), which passes even when static libraries lack their dependencies. This causes undefined reference errors (xmalloc, bfd_get_bits, etc.) when linking against static libopcodes without its required libbfd and libiberty. Fix by testing with an actual libopcodes symbol and trying increasingly complete library combinations until one succeeds. Fixes: 436326b ("objtool: fix build failure due to missing libopcodes check") Reported-by: Rafael J. Wysocki <[email protected]> Signed-off-by: Sasha Levin <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Tested-by: Rafael J. Wysocki (Intel) <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent 24d479d commit 3f2de81

1 file changed

Lines changed: 17 additions & 4 deletions

File tree

tools/objtool/Makefile

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,32 @@ HOST_OVERRIDES := CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)"
7777
# We check using HOSTCC directly rather than the shared feature framework
7878
# because objtool is a host tool that links against host libraries.
7979
#
80-
HAVE_LIBOPCODES := $(shell echo 'int main(void) { return 0; }' | \
81-
$(HOSTCC) -xc - -o /dev/null -lopcodes 2>/dev/null && echo y)
80+
# When using shared libraries, -lopcodes is sufficient as dependencies are
81+
# resolved automatically. With static libraries, we must explicitly link
82+
# against libopcodes' dependencies: libbfd, libiberty, and sometimes libz.
83+
# Try each combination and use the first one that succeeds.
84+
#
85+
LIBOPCODES_LIBS := $(shell \
86+
for libs in "-lopcodes" \
87+
"-lopcodes -lbfd" \
88+
"-lopcodes -lbfd -liberty" \
89+
"-lopcodes -lbfd -liberty -lz"; do \
90+
echo 'extern void disassemble_init_for_target(void *);' \
91+
'int main(void) { disassemble_init_for_target(0); return 0; }' | \
92+
$(HOSTCC) -xc - -o /dev/null $$libs 2>/dev/null && \
93+
echo "$$libs" && break; \
94+
done)
8295

8396
# Styled disassembler support requires binutils >= 2.39
8497
HAVE_DISASM_STYLED := $(shell echo '$(pound)include <dis-asm.h>' | \
8598
$(HOSTCC) -E -xc - 2>/dev/null | grep -q disassembler_style && echo y)
8699

87100
BUILD_DISAS := n
88101

89-
ifeq ($(HAVE_LIBOPCODES),y)
102+
ifneq ($(LIBOPCODES_LIBS),)
90103
BUILD_DISAS := y
91104
OBJTOOL_CFLAGS += -DDISAS -DPACKAGE='"objtool"'
92-
OBJTOOL_LDFLAGS += -lopcodes
105+
OBJTOOL_LDFLAGS += $(LIBOPCODES_LIBS)
93106
ifeq ($(HAVE_DISASM_STYLED),y)
94107
OBJTOOL_CFLAGS += -DDISASM_INIT_STYLED
95108
endif

0 commit comments

Comments
 (0)