mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-28 07:04:00 +08:00
39358a033b
Some asm (and inline asm) code does special things to the stack which objtool can't understand. (Nor can GCC or GNU assembler, for that matter.) In such cases we need a facility for the code to provide annotations, so the unwinder can unwind through it. This provides such a facility, in the form of unwind hints. They're similar to the GNU assembler .cfi* directives, but they give more information, and are needed in far fewer places, because objtool can fill in the blanks by following branches and adjusting the stack pointer for pushes and pops. Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Jiri Slaby <jslaby@suse.cz> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: live-patching@vger.kernel.org Link: http://lkml.kernel.org/r/0f5f3c9104fca559ff4088bece1d14ae3bca52d5.1499786555.git.jpoimboe@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
72 lines
2.6 KiB
Makefile
72 lines
2.6 KiB
Makefile
include ../scripts/Makefile.include
|
|
include ../scripts/Makefile.arch
|
|
|
|
ifeq ($(ARCH),x86_64)
|
|
ARCH := x86
|
|
endif
|
|
|
|
# always use the host compiler
|
|
CC = gcc
|
|
LD = ld
|
|
AR = ar
|
|
|
|
ifeq ($(srctree),)
|
|
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
|
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|
endif
|
|
|
|
SUBCMD_SRCDIR = $(srctree)/tools/lib/subcmd/
|
|
LIBSUBCMD_OUTPUT = $(if $(OUTPUT),$(OUTPUT),$(CURDIR)/)
|
|
LIBSUBCMD = $(LIBSUBCMD_OUTPUT)libsubcmd.a
|
|
|
|
OBJTOOL := $(OUTPUT)objtool
|
|
OBJTOOL_IN := $(OBJTOOL)-in.o
|
|
|
|
all: $(OBJTOOL)
|
|
|
|
INCLUDES := -I$(srctree)/tools/include -I$(srctree)/tools/arch/$(HOSTARCH)/include/uapi
|
|
CFLAGS += -Wall -Werror $(EXTRA_WARNINGS) -Wno-switch-default -Wno-switch-enum -fomit-frame-pointer -O2 -g $(INCLUDES)
|
|
LDFLAGS += -lelf $(LIBSUBCMD)
|
|
|
|
# Allow old libelf to be used:
|
|
elfshdr := $(shell echo '\#include <libelf.h>' | $(CC) $(CFLAGS) -x c -E - | grep elf_getshdr)
|
|
CFLAGS += $(if $(elfshdr),,-DLIBELF_USE_DEPRECATED)
|
|
|
|
AWK = awk
|
|
export srctree OUTPUT CFLAGS SRCARCH AWK
|
|
include $(srctree)/tools/build/Makefile.include
|
|
|
|
$(OBJTOOL_IN): fixdep FORCE
|
|
@$(MAKE) $(build)=objtool
|
|
|
|
# Busybox's diff doesn't have -I, avoid warning in that case
|
|
#
|
|
$(OBJTOOL): $(LIBSUBCMD) $(OBJTOOL_IN)
|
|
@(diff -I 2>&1 | grep -q 'option requires an argument' && \
|
|
test -d ../../kernel -a -d ../../tools -a -d ../objtool && (( \
|
|
diff -I'^#include' arch/x86/insn/insn.c ../../arch/x86/lib/insn.c >/dev/null && \
|
|
diff -I'^#include' arch/x86/insn/inat.c ../../arch/x86/lib/inat.c >/dev/null && \
|
|
diff arch/x86/insn/x86-opcode-map.txt ../../arch/x86/lib/x86-opcode-map.txt >/dev/null && \
|
|
diff arch/x86/insn/gen-insn-attr-x86.awk ../../arch/x86/tools/gen-insn-attr-x86.awk >/dev/null && \
|
|
diff -I'^#include' arch/x86/insn/insn.h ../../arch/x86/include/asm/insn.h >/dev/null && \
|
|
diff -I'^#include' arch/x86/insn/inat.h ../../arch/x86/include/asm/inat.h >/dev/null && \
|
|
diff -I'^#include' arch/x86/insn/inat_types.h ../../arch/x86/include/asm/inat_types.h >/dev/null) \
|
|
|| echo "warning: objtool: x86 instruction decoder differs from kernel" >&2 )) || true
|
|
@(test -d ../../kernel -a -d ../../tools -a -d ../objtool && (( \
|
|
diff ../../arch/x86/include/asm/orc_types.h orc_types.h >/dev/null) \
|
|
|| echo "warning: objtool: orc_types.h differs from kernel" >&2 )) || true
|
|
$(QUIET_LINK)$(CC) $(OBJTOOL_IN) $(LDFLAGS) -o $@
|
|
|
|
|
|
$(LIBSUBCMD): fixdep FORCE
|
|
$(Q)$(MAKE) -C $(SUBCMD_SRCDIR) OUTPUT=$(LIBSUBCMD_OUTPUT)
|
|
|
|
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/insn/inat-tables.c $(OUTPUT)fixdep
|
|
|
|
FORCE:
|
|
|
|
.PHONY: clean FORCE
|