| # SPDX-License-Identifier: GPL-2.0 | |
| # | |
| # Building vDSO images for x86. | |
| # | |
| # Include the generic Makefile to check the built vDSO: | |
| include $(srctree)/lib/vdso/Makefile.include | |
| obj-y += $(foreach x,$(vdsos-y),vdso$(x)-image.o) | |
| targets += $(foreach x,$(vdsos-y),vdso$(x)-image.c vdso$(x).so vdso$(x).so.dbg vdso$(x).lds) | |
| targets += $(vobjs-y) | |
| # vobjs-y with $(obj)/ prepended | |
| vobjs := $(addprefix $(obj)/,$(vobjs-y)) | |
| # Options for vdso*.lds | |
| CPPFLAGS_VDSO_LDS := -P -C -I$(src)/.. | |
| $(obj)/%.lds : KBUILD_CPPFLAGS += $(CPPFLAGS_VDSO_LDS) | |
| # | |
| # Options from KBUILD_[AC]FLAGS that should *NOT* be kept | |
| # | |
| flags-remove-y += \ | |
| -D__KERNEL__ -mcmodel=kernel -mregparm=3 \ | |
| -fno-pic -fno-PIC -fno-pie -fno-PIE \ | |
| -mfentry -pg \ | |
| $(RANDSTRUCT_CFLAGS) $(GCC_PLUGINS_CFLAGS) $(KSTACK_ERASE_CFLAGS) \ | |
| $(RETPOLINE_CFLAGS) $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \ | |
| $(PADDING_CFLAGS) | |
| # | |
| # Don't omit frame pointers for ease of userspace debugging, but do | |
| # optimize sibling calls. | |
| # | |
| flags-y += -D__DISABLE_EXPORTS | |
| flags-y += -DDISABLE_BRANCH_PROFILING | |
| flags-y += -DBUILD_VDSO | |
| flags-y += -I$(src)/.. -I$(srctree) | |
| flags-y += -O2 -fpic | |
| flags-y += -fno-stack-protector | |
| flags-y += -fno-omit-frame-pointer | |
| flags-y += -foptimize-sibling-calls | |
| flags-y += -fasynchronous-unwind-tables | |
| # Reset cf protections enabled by compiler default | |
| flags-y += $(call cc-option, -fcf-protection=none) | |
| flags-$(X86_USER_SHADOW_STACK) += $(call cc-option, -fcf-protection=return) | |
| # When user space IBT is supported, enable this. | |
| # flags-$(CONFIG_USER_IBT) += $(call cc-option, -fcf-protection=branch) | |
| flags-$(CONFIG_MITIGATION_RETPOLINE) += $(RETPOLINE_VDSO_CFLAGS) | |
| # These need to be conditional on $(vobjs) as they do not apply to | |
| # the output vdso*-image.o files which are standard kernel objects. | |
| $(vobjs) : KBUILD_AFLAGS := \ | |
| $(filter-out $(flags-remove-y),$(KBUILD_AFLAGS)) $(flags-y) | |
| $(vobjs) : KBUILD_CFLAGS := \ | |
| $(filter-out $(flags-remove-y),$(KBUILD_CFLAGS)) $(flags-y) | |
| # | |
| # The VDSO images are built using a special linker script. | |
| # | |
| VDSO_LDFLAGS := -shared --hash-style=both --build-id=sha1 --no-undefined \ | |
| $(call ld-option, --eh-frame-hdr) -Bsymbolic -z noexecstack | |
| quiet_cmd_vdso = VDSO $@ | |
| cmd_vdso = $(LD) -o $@ \ | |
| $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$*) \ | |
| -T $(filter %.lds,$^) $(filter %.o,$^) | |
| quiet_cmd_vdso_and_check = VDSO $@ | |
| cmd_vdso_and_check = $(cmd_vdso); $(cmd_vdso_check) | |
| $(obj)/vdso%.so.dbg: $(obj)/vdso%.lds FORCE | |
| $(call if_changed,vdso_and_check) | |
| $(obj)/%.so: OBJCOPYFLAGS := -S --remove-section __ex_table | |
| $(obj)/%.so: $(obj)/%.so.dbg FORCE | |
| $(call if_changed,objcopy) | |
| VDSO2C = $(objtree)/arch/x86/tools/vdso2c | |
| quiet_cmd_vdso2c = VDSO2C $@ | |
| cmd_vdso2c = $(VDSO2C) $< $(<:%.dbg=%) $@ | |
| $(obj)/%-image.c: $(obj)/%.so.dbg $(obj)/%.so $(VDSO2C) FORCE | |
| $(call if_changed,vdso2c) | |
| $(obj)/%-image.o: $(obj)/%-image.c |