xref: /linux/arch/x86/entry/vdso/common/Makefile.include (revision 693c819fedcdcabfda7488e2d5e355a84c2fd1b0)
1*693c819fSH. Peter Anvin# SPDX-License-Identifier: GPL-2.0
2*693c819fSH. Peter Anvin#
3*693c819fSH. Peter Anvin# Building vDSO images for x86.
4*693c819fSH. Peter Anvin#
5*693c819fSH. Peter Anvin
6*693c819fSH. Peter Anvin# Include the generic Makefile to check the built vDSO:
7*693c819fSH. Peter Anvininclude $(srctree)/lib/vdso/Makefile.include
8*693c819fSH. Peter Anvin
9*693c819fSH. Peter Anvinobj-y    += $(foreach x,$(vdsos-y),vdso$(x)-image.o)
10*693c819fSH. Peter Anvin
11*693c819fSH. Peter Anvintargets  += $(foreach x,$(vdsos-y),vdso$(x)-image.c vdso$(x).so vdso$(x).so.dbg vdso$(x).lds)
12*693c819fSH. Peter Anvintargets  += $(vobjs-y)
13*693c819fSH. Peter Anvin
14*693c819fSH. Peter Anvin# vobjs-y with $(obj)/ prepended
15*693c819fSH. Peter Anvinvobjs := $(addprefix $(obj)/,$(vobjs-y))
16*693c819fSH. Peter Anvin
17*693c819fSH. Peter Anvin# Options for vdso*.lds
18*693c819fSH. Peter AnvinCPPFLAGS_VDSO_LDS := -P -C -I$(src)/..
19*693c819fSH. Peter Anvin$(obj)/%.lds : KBUILD_CPPFLAGS += $(CPPFLAGS_VDSO_LDS)
20*693c819fSH. Peter Anvin
21*693c819fSH. Peter Anvin#
22*693c819fSH. Peter Anvin# Options from KBUILD_[AC]FLAGS that should *NOT* be kept
23*693c819fSH. Peter Anvin#
24*693c819fSH. Peter Anvinflags-remove-y += \
25*693c819fSH. Peter Anvin	-D__KERNEL__ -mcmodel=kernel -mregparm=3 \
26*693c819fSH. Peter Anvin	-fno-pic -fno-PIC -fno-pie fno-PIE \
27*693c819fSH. Peter Anvin	-mfentry -pg \
28*693c819fSH. Peter Anvin	$(RANDSTRUCT_CFLAGS) $(GCC_PLUGIN_CFLAGS) $(KSTACK_ERASE_CFLAGS) \
29*693c819fSH. Peter Anvin	$(RETPOLINE_CFLAGS) $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \
30*693c819fSH. Peter Anvin	$(PADDING_CFLAGS)
31*693c819fSH. Peter Anvin
32*693c819fSH. Peter Anvin#
33*693c819fSH. Peter Anvin# Don't omit frame pointers for ease of userspace debugging, but do
34*693c819fSH. Peter Anvin# optimize sibling calls.
35*693c819fSH. Peter Anvin#
36*693c819fSH. Peter Anvinflags-y += -D__DISABLE_EXPORTS
37*693c819fSH. Peter Anvinflags-y += -DDISABLE_BRANCH_PROFILING
38*693c819fSH. Peter Anvinflags-y += -DBUILD_VDSO
39*693c819fSH. Peter Anvinflags-y += -I$(src)/.. -I$(srctree)
40*693c819fSH. Peter Anvinflags-y += -O2 -fpic
41*693c819fSH. Peter Anvinflags-y += -fno-stack-protector
42*693c819fSH. Peter Anvinflags-y += -fno-omit-frame-pointer
43*693c819fSH. Peter Anvinflags-y += -foptimize-sibling-calls
44*693c819fSH. Peter Anvinflags-y += -fasynchronous-unwind-tables
45*693c819fSH. Peter Anvin
46*693c819fSH. Peter Anvin# Reset cf protections enabled by compiler default
47*693c819fSH. Peter Anvinflags-y += $(call cc-option, -fcf-protection=none)
48*693c819fSH. Peter Anvinflags-$(X86_USER_SHADOW_STACK) += $(call cc-option, -fcf-protection=return)
49*693c819fSH. Peter Anvin# When user space IBT is supported, enable this.
50*693c819fSH. Peter Anvin# flags-$(CONFIG_USER_IBT) += $(call cc-option, -fcf-protection=branch)
51*693c819fSH. Peter Anvin
52*693c819fSH. Peter Anvinflags-$(CONFIG_MITIGATION_RETPOLINE) += $(RETPOLINE_VDSO_CFLAGS)
53*693c819fSH. Peter Anvin
54*693c819fSH. Peter Anvin# These need to be conditional on $(vobjs) as they do not apply to
55*693c819fSH. Peter Anvin# the output vdso*-image.o files which are standard kernel objects.
56*693c819fSH. Peter Anvin$(vobjs) : KBUILD_AFLAGS := \
57*693c819fSH. Peter Anvin	$(filter-out $(flags-remove-y),$(KBUILD_AFLAGS)) $(flags-y)
58*693c819fSH. Peter Anvin$(vobjs) : KBUILD_CFLAGS := \
59*693c819fSH. Peter Anvin	$(filter-out $(flags-remove-y),$(KBUILD_CFLAGS)) $(flags-y)
60*693c819fSH. Peter Anvin
61*693c819fSH. Peter Anvin#
62*693c819fSH. Peter Anvin# The VDSO images are built using a special linker script.
63*693c819fSH. Peter Anvin#
64*693c819fSH. Peter AnvinVDSO_LDFLAGS := -shared --hash-style=both --build-id=sha1 --no-undefined \
65*693c819fSH. Peter Anvin	$(call ld-option, --eh-frame-hdr) -Bsymbolic -z noexecstack
66*693c819fSH. Peter Anvin
67*693c819fSH. Peter Anvinquiet_cmd_vdso = VDSO    $@
68*693c819fSH. Peter Anvin      cmd_vdso = $(LD) -o $@ \
69*693c819fSH. Peter Anvin		       $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$*) \
70*693c819fSH. Peter Anvin		       -T $(filter %.lds,$^) $(filter %.o,$^)
71*693c819fSH. Peter Anvinquiet_cmd_vdso_and_check = VDSO    $@
72*693c819fSH. Peter Anvin      cmd_vdso_and_check = $(cmd_vdso); $(cmd_vdso_check)
73*693c819fSH. Peter Anvin
74*693c819fSH. Peter Anvin$(obj)/vdso%.so.dbg: $(obj)/vdso%.lds FORCE
75*693c819fSH. Peter Anvin	$(call if_changed,vdso_and_check)
76*693c819fSH. Peter Anvin
77*693c819fSH. Peter Anvin$(obj)/%.so: OBJCOPYFLAGS := -S --remove-section __ex_table
78*693c819fSH. Peter Anvin$(obj)/%.so: $(obj)/%.so.dbg FORCE
79*693c819fSH. Peter Anvin	$(call if_changed,objcopy)
80*693c819fSH. Peter Anvin
81*693c819fSH. Peter AnvinVDSO2C = $(objtree)/arch/x86/tools/vdso2c
82*693c819fSH. Peter Anvin
83*693c819fSH. Peter Anvinquiet_cmd_vdso2c = VDSO2C  $@
84*693c819fSH. Peter Anvin      cmd_vdso2c = $(VDSO2C) $< $(<:%.dbg=%) $@
85*693c819fSH. Peter Anvin
86*693c819fSH. Peter Anvin$(obj)/%-image.c: $(obj)/%.so.dbg $(obj)/%.so $(VDSO2C) FORCE
87*693c819fSH. Peter Anvin	$(call if_changed,vdso2c)
88*693c819fSH. Peter Anvin
89*693c819fSH. Peter Anvin$(obj)/%-image.o: $(obj)/%-image.c
90