mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 05:34:13 -05:00
Building objtool with disassembly support can fail when including
the bdf.h file:
In file included from tools/objtool/include/objtool/arch.h:108,
from check.c:14:
/usr/include/bfd.h:35:2: error: #error config.h must be included before this header
35 | #error config.h must be included before this header
| ^~~~~
This check is present in the bfd.h file generated from the binutils
source code, but it is not necessarily present in the bfd.h file
provided in a binutil package (for example, it is not present in
the binutil RPM).
The solution to this issue is to define the PACKAGE macro before
including bfd.h. This is the solution suggested by the binutil
developer in bug 14243, and it is used by other kernel tools
which also use bfd.h (perf and bpf).
Fixes: 5995330382 ("objtool: Disassemble code with libopcodes instead of running objdump")
Closes: https://lore.kernel.org/all/3fa261fd-3b46-4cbe-b48d-7503aabc96cb@oracle.com/
Reported-by: Nathan Chancellor <nathan@kernel.org>
Suggested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://sourceware.org/bugzilla/show_bug.cgi?id=14243
Link: https://patch.msgid.link/20251126134519.1760889-1-alexandre.chartre@oracle.com
136 lines
3.9 KiB
Makefile
136 lines
3.9 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
include ../scripts/Makefile.include
|
|
include ../scripts/Makefile.arch
|
|
|
|
ifeq ($(SRCARCH),x86)
|
|
BUILD_ORC := y
|
|
ARCH_HAS_KLP := y
|
|
endif
|
|
|
|
ifeq ($(SRCARCH),loongarch)
|
|
BUILD_ORC := y
|
|
endif
|
|
|
|
ifeq ($(ARCH_HAS_KLP),y)
|
|
HAVE_XXHASH = $(shell printf "$(pound)include <xxhash.h>\nXXH3_state_t *state;int main() {}" | \
|
|
$(HOSTCC) -xc - -o /dev/null -lxxhash 2> /dev/null && echo y || echo n)
|
|
ifeq ($(HAVE_XXHASH),y)
|
|
BUILD_KLP := y
|
|
LIBXXHASH_CFLAGS := $(shell $(HOSTPKG_CONFIG) libxxhash --cflags 2>/dev/null) \
|
|
-DBUILD_KLP
|
|
LIBXXHASH_LIBS := $(shell $(HOSTPKG_CONFIG) libxxhash --libs 2>/dev/null || echo -lxxhash)
|
|
endif
|
|
endif
|
|
|
|
export BUILD_ORC BUILD_KLP
|
|
|
|
ifeq ($(srctree),)
|
|
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
|
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|
endif
|
|
|
|
LIBSUBCMD_DIR = $(srctree)/tools/lib/subcmd/
|
|
ifneq ($(OUTPUT),)
|
|
LIBSUBCMD_OUTPUT = $(abspath $(OUTPUT))/libsubcmd
|
|
else
|
|
LIBSUBCMD_OUTPUT = $(CURDIR)/libsubcmd
|
|
endif
|
|
LIBSUBCMD = $(LIBSUBCMD_OUTPUT)/libsubcmd.a
|
|
|
|
OBJTOOL := $(OUTPUT)objtool
|
|
OBJTOOL_IN := $(OBJTOOL)-in.o
|
|
|
|
LIBELF_FLAGS := $(shell $(HOSTPKG_CONFIG) libelf --cflags 2>/dev/null)
|
|
LIBELF_LIBS := $(shell $(HOSTPKG_CONFIG) libelf --libs 2>/dev/null || echo -lelf)
|
|
|
|
all: $(OBJTOOL)
|
|
|
|
WARNINGS := -Werror -Wall -Wextra -Wmissing-prototypes \
|
|
-Wmissing-declarations -Wwrite-strings \
|
|
-Wno-implicit-fallthrough -Wno-sign-compare \
|
|
-Wno-unused-parameter
|
|
|
|
INCLUDES := -I$(srctree)/tools/include \
|
|
-I$(srctree)/tools/include/uapi \
|
|
-I$(srctree)/tools/arch/$(HOSTARCH)/include/uapi \
|
|
-I$(srctree)/tools/arch/$(SRCARCH)/include \
|
|
-I$(srctree)/tools/objtool/include \
|
|
-I$(srctree)/tools/objtool/arch/$(SRCARCH)/include \
|
|
-I$(LIBSUBCMD_OUTPUT)/include
|
|
|
|
OBJTOOL_CFLAGS := -std=gnu11 -fomit-frame-pointer -O2 -g $(WARNINGS) \
|
|
$(INCLUDES) $(LIBELF_FLAGS) $(LIBXXHASH_CFLAGS) $(HOSTCFLAGS)
|
|
|
|
OBJTOOL_LDFLAGS := $(LIBSUBCMD) $(LIBELF_LIBS) $(LIBXXHASH_LIBS) $(HOSTLDFLAGS)
|
|
|
|
# Allow old libelf to be used:
|
|
elfshdr := $(shell echo '$(pound)include <libelf.h>' | $(HOSTCC) $(OBJTOOL_CFLAGS) -x c -E - 2>/dev/null | grep elf_getshdr)
|
|
OBJTOOL_CFLAGS += $(if $(elfshdr),,-DLIBELF_USE_DEPRECATED)
|
|
|
|
# Always want host compilation.
|
|
HOST_OVERRIDES := CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)"
|
|
|
|
#
|
|
# To support disassembly, objtool needs libopcodes which is provided
|
|
# with libbdf (binutils-dev or binutils-devel package).
|
|
#
|
|
FEATURE_USER = .objtool
|
|
FEATURE_TESTS = libbfd disassembler-init-styled
|
|
FEATURE_DISPLAY =
|
|
include $(srctree)/tools/build/Makefile.feature
|
|
|
|
ifeq ($(feature-disassembler-init-styled), 1)
|
|
OBJTOOL_CFLAGS += -DDISASM_INIT_STYLED
|
|
endif
|
|
|
|
BUILD_DISAS := n
|
|
|
|
ifeq ($(feature-libbfd),1)
|
|
BUILD_DISAS := y
|
|
OBJTOOL_CFLAGS += -DDISAS -DPACKAGE="objtool"
|
|
OBJTOOL_LDFLAGS += -lopcodes
|
|
endif
|
|
|
|
export BUILD_DISAS
|
|
|
|
AWK = awk
|
|
MKDIR = mkdir
|
|
|
|
export srctree OUTPUT CFLAGS SRCARCH AWK
|
|
include $(srctree)/tools/build/Makefile.include
|
|
|
|
$(OBJTOOL_IN): fixdep $(LIBSUBCMD) FORCE
|
|
$(Q)$(CONFIG_SHELL) ./sync-check.sh
|
|
$(Q)$(MAKE) $(build)=objtool $(HOST_OVERRIDES) CFLAGS="$(OBJTOOL_CFLAGS)" \
|
|
LDFLAGS="$(OBJTOOL_LDFLAGS)"
|
|
|
|
|
|
$(OBJTOOL): $(LIBSUBCMD) $(OBJTOOL_IN)
|
|
$(QUIET_LINK)$(HOSTCC) $(OBJTOOL_IN) $(OBJTOOL_LDFLAGS) -o $@
|
|
|
|
|
|
$(LIBSUBCMD_OUTPUT):
|
|
$(Q)$(MKDIR) -p $@
|
|
|
|
$(LIBSUBCMD): fixdep $(LIBSUBCMD_OUTPUT) FORCE
|
|
$(Q)$(MAKE) -C $(LIBSUBCMD_DIR) O=$(LIBSUBCMD_OUTPUT) \
|
|
DESTDIR=$(LIBSUBCMD_OUTPUT) prefix= subdir= \
|
|
$(HOST_OVERRIDES) EXTRA_CFLAGS="$(OBJTOOL_CFLAGS)" \
|
|
$@ install_headers
|
|
|
|
$(LIBSUBCMD)-clean:
|
|
$(call QUIET_CLEAN, libsubcmd)
|
|
$(Q)$(RM) -r -- $(LIBSUBCMD_OUTPUT)
|
|
|
|
clean: $(LIBSUBCMD)-clean
|
|
$(call QUIET_CLEAN, objtool) $(RM) $(OBJTOOL)
|
|
$(Q)find $(OUTPUT) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
|
|
$(Q)$(RM) $(OUTPUT)arch/x86/lib/cpu-feature-names.c $(OUTPUT)fixdep
|
|
$(Q)$(RM) $(OUTPUT)arch/x86/lib/inat-tables.c $(OUTPUT)fixdep
|
|
$(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.objtool
|
|
$(Q)$(RM) -r -- $(OUTPUT)feature
|
|
|
|
FORCE:
|
|
|
|
.PHONY: clean FORCE
|