xref: /linux/arch/x86/entry/vdso/Makefile (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
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