1b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 2d603c8e1SIngo Molnar# 3d603c8e1SIngo Molnar# Building vDSO images for x86. 4d603c8e1SIngo Molnar# 5d603c8e1SIngo Molnar 6b7bcffe7SIngo Molnar# Include the generic Makefile to check the built vDSO: 7127b0e05SThomas Weißschuhinclude $(srctree)/lib/vdso/Makefile.include 87ac87074SVincenzo Frascino 9b7bcffe7SIngo Molnar# Files to link into the vDSO: 1033385150SJason A. Donenfeldvobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o vgetrandom.o vgetrandom-chacha.o 11cd2f45b7SDmitry Safonovvobjs32-y := vdso32/note.o vdso32/system_call.o vdso32/sigreturn.o 1292d33063SSebastian Andrzej Siewiorvobjs32-y += vdso32/vclock_gettime.o vdso32/vgetcpu.o 1384664369SSean Christophersonvobjs-$(CONFIG_X86_SGX) += vsgx.o 14d603c8e1SIngo Molnar 15b7bcffe7SIngo Molnar# Files to link into the kernel: 168382c668SSean Christophersonobj-y += vma.o extable.o 17d603c8e1SIngo Molnar 18b7bcffe7SIngo Molnar# vDSO images to build: 19329b77b5SMasahiro Yamadaobj-$(CONFIG_X86_64) += vdso-image-64.o 20329b77b5SMasahiro Yamadaobj-$(CONFIG_X86_X32_ABI) += vdso-image-x32.o 21289d0a47SMasahiro Yamadaobj-$(CONFIG_COMPAT_32) += vdso-image-32.o vdso32-setup.o 22d603c8e1SIngo Molnar 23ac9275b3SMasahiro Yamadavobjs := $(addprefix $(obj)/, $(vobjs-y)) 24ac9275b3SMasahiro Yamadavobjs32 := $(addprefix $(obj)/, $(vobjs32-y)) 25d603c8e1SIngo Molnar 26d603c8e1SIngo Molnar$(obj)/vdso.o: $(obj)/vdso.so 27d603c8e1SIngo Molnar 28d603c8e1SIngo Molnartargets += vdso.lds $(vobjs-y) 29cd2f45b7SDmitry Safonovtargets += vdso32/vdso32.lds $(vobjs32-y) 30d603c8e1SIngo Molnar 3131a4ebeeSMasahiro Yamadatargets += $(foreach x, 64 x32 32, vdso-image-$(x).c vdso$(x).so vdso$(x).so.dbg) 32d603c8e1SIngo Molnar 3361615fafSMasahiro YamadaCPPFLAGS_vdso.lds += -P -C 34d603c8e1SIngo Molnar 35*c080f2b8SThomas WeißschuhVDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -soname linux-vdso.so.1 \ 36ac3e233dSNick Desaulniers -z max-page-size=4096 37d603c8e1SIngo Molnar 381742ed20SMasahiro Yamada$(obj)/vdso64.so.dbg: $(obj)/vdso.lds $(vobjs) FORCE 39e9a1379fSNaohiro Aota $(call if_changed,vdso_and_check) 40d603c8e1SIngo Molnar 41d51306f1SStephen RothwellHOST_EXTRACFLAGS += -I$(srctree)/tools/include -I$(srctree)/include/uapi -I$(srctree)/arch/$(SUBARCH)/include/uapi 425f2fb52fSMasahiro Yamadahostprogs += vdso2c 43d603c8e1SIngo Molnar 44d603c8e1SIngo Molnarquiet_cmd_vdso2c = VDSO2C $@ 45c5fcdbf1SMasahiro Yamada cmd_vdso2c = $(obj)/vdso2c $< $(<:%.dbg=%) $@ 46d603c8e1SIngo Molnar 47d603c8e1SIngo Molnar$(obj)/vdso-image-%.c: $(obj)/vdso%.so.dbg $(obj)/vdso%.so $(obj)/vdso2c FORCE 48d603c8e1SIngo Molnar $(call if_changed,vdso2c) 49d603c8e1SIngo Molnar 50d603c8e1SIngo Molnar# 51d603c8e1SIngo Molnar# Don't omit frame pointers for ease of userspace debugging, but do 52d603c8e1SIngo Molnar# optimize sibling calls. 53d603c8e1SIngo Molnar# 54d603c8e1SIngo MolnarCFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \ 55893ab004SMasahiro Yamada $(filter -g%,$(KBUILD_CFLAGS)) -fno-stack-protector \ 56d603c8e1SIngo Molnar -fno-omit-frame-pointer -foptimize-sibling-calls \ 574f166564SAndy Lutomirski -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO 584f166564SAndy Lutomirski 59aefb2f2eSBreno Leitaoifdef CONFIG_MITIGATION_RETPOLINE 604f166564SAndy Lutomirskiifneq ($(RETPOLINE_VDSO_CFLAGS),) 614f166564SAndy Lutomirski CFL += $(RETPOLINE_VDSO_CFLAGS) 624f166564SAndy Lutomirskiendif 634f166564SAndy Lutomirskiendif 64d603c8e1SIngo Molnar 65bea75b33SThomas Gleixner$(vobjs): KBUILD_CFLAGS := $(filter-out $(PADDING_CFLAGS) $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) $(RANDSTRUCT_CFLAGS) $(GCC_PLUGINS_CFLAGS) $(RETPOLINE_CFLAGS),$(KBUILD_CFLAGS)) $(CFL) 66aa3d4803SPeter Zijlstra$(vobjs): KBUILD_AFLAGS += -DBUILD_VDSO 67d603c8e1SIngo Molnar 68d603c8e1SIngo Molnar# 69d603c8e1SIngo Molnar# vDSO code runs in userspace and -pg doesn't help with profiling anyway. 70d603c8e1SIngo Molnar# 71d603c8e1SIngo MolnarCFLAGS_REMOVE_vclock_gettime.o = -pg 7254b8ae66SMasahiro YamadaCFLAGS_REMOVE_vdso32/vclock_gettime.o = -pg 73d603c8e1SIngo MolnarCFLAGS_REMOVE_vgetcpu.o = -pg 7492d33063SSebastian Andrzej SiewiorCFLAGS_REMOVE_vdso32/vgetcpu.o = -pg 7584664369SSean ChristophersonCFLAGS_REMOVE_vsgx.o = -pg 7633385150SJason A. DonenfeldCFLAGS_REMOVE_vgetrandom.o = -pg 77d603c8e1SIngo Molnar 78d603c8e1SIngo Molnar# 79d603c8e1SIngo Molnar# X32 processes use x32 vDSO to access 64bit kernel data. 80d603c8e1SIngo Molnar# 81d603c8e1SIngo Molnar# Build x32 vDSO image: 82d603c8e1SIngo Molnar# 1. Compile x32 vDSO as 64bit. 83d603c8e1SIngo Molnar# 2. Convert object files to x32. 84d603c8e1SIngo Molnar# 3. Build x32 VDSO image with x32 objects, which contains 64bit codes 85d603c8e1SIngo Molnar# so that it can reach 64bit address space with 64bit pointers. 86d603c8e1SIngo Molnar# 87d603c8e1SIngo Molnar 88d603c8e1SIngo MolnarCPPFLAGS_vdsox32.lds = $(CPPFLAGS_vdso.lds) 89379d98ddSAlistair StrachanVDSO_LDFLAGS_vdsox32.lds = -m elf32_x86_64 -soname linux-vdso.so.1 \ 90ac3e233dSNick Desaulniers -z max-page-size=4096 91d603c8e1SIngo Molnar 92d603c8e1SIngo Molnar# x32-rebranded versions 93b3656612SMasahiro Yamadavobjx32s-y := $(vobjs-y:.o=-x32.o) 94d603c8e1SIngo Molnar 95d603c8e1SIngo Molnar# same thing, but in the output directory 96ac9275b3SMasahiro Yamadavobjx32s := $(addprefix $(obj)/, $(vobjx32s-y)) 97d603c8e1SIngo Molnar 98d603c8e1SIngo Molnar# Convert 64bit object file to x32 for x32 vDSO. 99d603c8e1SIngo Molnarquiet_cmd_x32 = X32 $@ 100d603c8e1SIngo Molnar cmd_x32 = $(OBJCOPY) -O elf32-x86-64 $< $@ 101d603c8e1SIngo Molnar 102d603c8e1SIngo Molnar$(obj)/%-x32.o: $(obj)/%.o FORCE 103d603c8e1SIngo Molnar $(call if_changed,x32) 104d603c8e1SIngo Molnar 105d603c8e1SIngo Molnartargets += vdsox32.lds $(vobjx32s-y) 106d603c8e1SIngo Molnar 1078382c668SSean Christopherson$(obj)/%.so: OBJCOPYFLAGS := -S --remove-section __ex_table 10855a6d00eSMasahiro Yamada$(obj)/%.so: $(obj)/%.so.dbg FORCE 109d603c8e1SIngo Molnar $(call if_changed,objcopy) 110d603c8e1SIngo Molnar 1111742ed20SMasahiro Yamada$(obj)/vdsox32.so.dbg: $(obj)/vdsox32.lds $(vobjx32s) FORCE 112e9a1379fSNaohiro Aota $(call if_changed,vdso_and_check) 113d603c8e1SIngo Molnar 11454b8ae66SMasahiro YamadaCPPFLAGS_vdso32/vdso32.lds = $(CPPFLAGS_vdso.lds) 115379d98ddSAlistair StrachanVDSO_LDFLAGS_vdso32.lds = -m elf_i386 -soname linux-gate.so.1 116d603c8e1SIngo Molnar 117f24f9108SAndy LutomirskiKBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS)) -DBUILD_VDSO 1180a6d1fa0SAndy Lutomirski$(obj)/vdso32.so.dbg: KBUILD_AFLAGS = $(KBUILD_AFLAGS_32) 1190a6d1fa0SAndy Lutomirski$(obj)/vdso32.so.dbg: asflags-$(CONFIG_X86_64) += -m32 120d603c8e1SIngo Molnar 121d603c8e1SIngo MolnarKBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS)) 122d603c8e1SIngo MolnarKBUILD_CFLAGS_32 := $(filter-out -mcmodel=kernel,$(KBUILD_CFLAGS_32)) 123d603c8e1SIngo MolnarKBUILD_CFLAGS_32 := $(filter-out -fno-pic,$(KBUILD_CFLAGS_32)) 124d603c8e1SIngo MolnarKBUILD_CFLAGS_32 := $(filter-out -mfentry,$(KBUILD_CFLAGS_32)) 125613f4b3eSKees CookKBUILD_CFLAGS_32 := $(filter-out $(RANDSTRUCT_CFLAGS),$(KBUILD_CFLAGS_32)) 1266b90bd4bSEmese RevfyKBUILD_CFLAGS_32 := $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS_32)) 1272e549b2eSAndy LutomirskiKBUILD_CFLAGS_32 := $(filter-out $(RETPOLINE_CFLAGS),$(KBUILD_CFLAGS_32)) 128e242db40SSami TolvanenKBUILD_CFLAGS_32 := $(filter-out $(CC_FLAGS_LTO),$(KBUILD_CFLAGS_32)) 129f143ff39SSami TolvanenKBUILD_CFLAGS_32 := $(filter-out $(CC_FLAGS_CFI),$(KBUILD_CFLAGS_32)) 130bea75b33SThomas GleixnerKBUILD_CFLAGS_32 := $(filter-out $(PADDING_CFLAGS),$(KBUILD_CFLAGS_32)) 131d603c8e1SIngo MolnarKBUILD_CFLAGS_32 += -m32 -msoft-float -mregparm=0 -fpic 132893ab004SMasahiro YamadaKBUILD_CFLAGS_32 += -fno-stack-protector 133d603c8e1SIngo MolnarKBUILD_CFLAGS_32 += $(call cc-option, -foptimize-sibling-calls) 134d603c8e1SIngo MolnarKBUILD_CFLAGS_32 += -fno-omit-frame-pointer 135d603c8e1SIngo MolnarKBUILD_CFLAGS_32 += -DDISABLE_BRANCH_PROFILING 136582077c9SPeter ZijlstraKBUILD_CFLAGS_32 += -DBUILD_VDSO 1374f166564SAndy Lutomirski 138aefb2f2eSBreno Leitaoifdef CONFIG_MITIGATION_RETPOLINE 1394f166564SAndy Lutomirskiifneq ($(RETPOLINE_VDSO_CFLAGS),) 1402e549b2eSAndy Lutomirski KBUILD_CFLAGS_32 += $(RETPOLINE_VDSO_CFLAGS) 1414f166564SAndy Lutomirskiendif 1424f166564SAndy Lutomirskiendif 1434f166564SAndy Lutomirski 1440a6d1fa0SAndy Lutomirski$(obj)/vdso32.so.dbg: KBUILD_CFLAGS = $(KBUILD_CFLAGS_32) 145d603c8e1SIngo Molnar 146cd2f45b7SDmitry Safonov$(obj)/vdso32.so.dbg: $(obj)/vdso32/vdso32.lds $(vobjs32) FORCE 147e9a1379fSNaohiro Aota $(call if_changed,vdso_and_check) 148d603c8e1SIngo Molnar 149d603c8e1SIngo Molnar# 150d603c8e1SIngo Molnar# The DSO images are built using a special linker script. 151d603c8e1SIngo Molnar# 152d603c8e1SIngo Molnarquiet_cmd_vdso = VDSO $@ 153a41f5b78SMasahiro Yamada cmd_vdso = $(LD) -o $@ \ 154d603c8e1SIngo Molnar $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \ 155*c080f2b8SThomas Weißschuh -T $(filter %.lds,$^) $(filter %.o,$^) 156d603c8e1SIngo Molnar 157*c080f2b8SThomas WeißschuhVDSO_LDFLAGS = -shared --hash-style=both --build-id=sha1 --no-undefined \ 158ffcf9c57SNick Desaulniers $(call ld-option, --eh-frame-hdr) -Bsymbolic -z noexecstack 159d603c8e1SIngo Molnar 160e9a1379fSNaohiro Aotaquiet_cmd_vdso_and_check = VDSO $@ 161e9a1379fSNaohiro Aota cmd_vdso_and_check = $(cmd_vdso); $(cmd_vdso_check) 162