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