mips: vdso: fix 'jalr t9' crash in vdso code
[linux-block.git] / arch / mips / vdso / Makefile
CommitLineData
b2441318 1# SPDX-License-Identifier: GPL-2.0
ebb5e78c 2# Objects to go into the VDSO.
24640f23
VF
3
4# Absolute relocation type $(ARCH_REL_TYPE_ABS) needs to be defined before
5# the inclusion of generic Makefile.
6ARCH_REL_TYPE_ABS := R_MIPS_JUMP_SLOT|R_MIPS_GLOB_DAT
7include $(srctree)/lib/vdso/Makefile
8
9obj-vdso-y := elf.o vgettimeofday.o sigreturn.o
ebb5e78c
AS
10
11# Common compiler flags between ABIs.
12ccflags-vdso := \
13 $(filter -I%,$(KBUILD_CFLAGS)) \
14 $(filter -E%,$(KBUILD_CFLAGS)) \
bb93078e 15 $(filter -mmicromips,$(KBUILD_CFLAGS)) \
351fdddd 16 $(filter -march=%,$(KBUILD_CFLAGS)) \
0648e50e 17 $(filter -m%-float,$(KBUILD_CFLAGS)) \
2f2b4fd6 18 $(filter -mno-loongson-%,$(KBUILD_CFLAGS)) \
351fdddd 19 -D__VDSO__
ee67855e 20
99570c3d
TG
21ifndef CONFIG_64BIT
22ccflags-vdso += -DBUILD_VDSO32
23endif
24
076f421d 25ifdef CONFIG_CC_IS_CLANG
ee67855e
PB
26ccflags-vdso += $(filter --target=%,$(KBUILD_CFLAGS))
27endif
28
24640f23
VF
29#
30# The -fno-jump-tables flag only prevents the compiler from generating
31# jump tables but does not prevent the compiler from emitting absolute
32# offsets.
ebb5e78c
AS
33cflags-vdso := $(ccflags-vdso) \
34 $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \
24640f23 35 -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \
d3f703c4 36 -mrelax-pic-calls -mexplicit-relocs \
24640f23 37 -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \
cfd75c2d 38 $(call cc-option, -fno-asynchronous-unwind-tables) \
ebb5e78c
AS
39 $(call cc-option, -fno-stack-protector)
40aflags-vdso := $(ccflags-vdso) \
ebb5e78c
AS
41 -D__ASSEMBLY__ -Wa,-gdwarf-2
42
24640f23
VF
43ifneq ($(c-gettimeofday-y),)
44CFLAGS_vgettimeofday.o = -include $(c-gettimeofday-y)
45
46# config-n32-o32-env.c prepares the environment to build a 32bit vDSO
47# library on a 64bit kernel.
48# Note: Needs to be included before than the generic library.
b4c0f7fa
VF
49CFLAGS_vgettimeofday-o32.o = -include $(srctree)/$(src)/config-n32-o32-env.c -include $(c-gettimeofday-y)
50CFLAGS_vgettimeofday-n32.o = -include $(srctree)/$(src)/config-n32-o32-env.c -include $(c-gettimeofday-y)
24640f23
VF
51endif
52
53CFLAGS_REMOVE_vgettimeofday.o = -pg
54
ebb5e78c
AS
55#
56# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
57# the base address of VDSO, the linker will emit a R_MIPS_PC32
58# relocation in binutils > 2.25 but it will fail with older versions
59# because that relocation is not supported for that symbol. As a result
60# of which we are forced to disable the VDSO symbols when building
61# with < 2.25 binutils on pre-R6 kernels. For more references on why we
62# can't use other methods to get the base address of VDSO please refer to
63# the comments on that file.
64#
65ifndef CONFIG_CPU_MIPSR6
d5ece1cb 66 ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
2a037f31 67 $(warning MIPS VDSO requires binutils >= 2.25)
8919975b 68 obj-vdso-y := $(filter-out vgettimeofday.o, $(obj-vdso-y))
ebb5e78c
AS
69 ccflags-vdso += -DDISABLE_MIPS_VDSO
70 endif
71endif
72
73# VDSO linker flags.
74VDSO_LDFLAGS := \
75 -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1 \
2f002567 76 $(addprefix -Wl$(comma),$(filter -E%,$(KBUILD_CFLAGS))) \
1e022137 77 -nostdlib -shared -Wl,--hash-style=sysv -Wl,--build-id
ebb5e78c 78
24640f23
VF
79CFLAGS_REMOVE_vdso.o = -pg
80
ebb5e78c 81GCOV_PROFILE := n
1e35918a 82UBSAN_SANITIZE := n
dcf78ee6 83KCOV_INSTRUMENT := n
ebb5e78c
AS
84
85#
86# Shared build commands.
87#
88
cdab7e2c
VF
89quiet_cmd_vdsold_and_vdso_check = LD $@
90 cmd_vdsold_and_vdso_check = $(cmd_vdsold); $(cmd_vdso_check)
91
ebb5e78c
AS
92quiet_cmd_vdsold = VDSO $@
93 cmd_vdsold = $(CC) $(c_flags) $(VDSO_LDFLAGS) \
94 -Wl,-T $(filter %.lds,$^) $(filter %.o,$^) -o $@
95
cdab7e2c 96quiet_cmd_vdsoas_o_S = AS $@
b668970e
AB
97 cmd_vdsoas_o_S = $(CC) $(a_flags) -c -o $@ $<
98
2afb9745
JH
99# Strip rule for the raw .so files
100$(obj)/%.so.raw: OBJCOPYFLAGS := -S
101$(obj)/%.so.raw: $(obj)/%.so.dbg.raw FORCE
102 $(call if_changed,objcopy)
103
5f2fb52f 104hostprogs := genvdso
ebb5e78c
AS
105
106quiet_cmd_genvdso = GENVDSO $@
107define cmd_genvdso
2afb9745
JH
108 $(foreach file,$(filter %.raw,$^),cp $(file) $(file:%.raw=%) &&) \
109 $(obj)/genvdso $(<:%.raw=%) $(<:%.dbg.raw=%) $@ $(VDSO_NAME)
ebb5e78c
AS
110endef
111
112#
113# Build native VDSO.
114#
115
116native-abi := $(filter -mabi=%,$(KBUILD_CFLAGS))
117
118targets += $(obj-vdso-y)
2afb9745
JH
119targets += vdso.lds
120targets += vdso.so.dbg.raw vdso.so.raw
121targets += vdso.so.dbg vdso.so
122targets += vdso-image.c
ebb5e78c
AS
123
124obj-vdso := $(obj-vdso-y:%.o=$(obj)/%.o)
125
126$(obj-vdso): KBUILD_CFLAGS := $(cflags-vdso) $(native-abi)
127$(obj-vdso): KBUILD_AFLAGS := $(aflags-vdso) $(native-abi)
128
034827c7 129$(obj)/vdso.lds: KBUILD_CPPFLAGS := $(ccflags-vdso) $(native-abi)
ebb5e78c 130
2afb9745 131$(obj)/vdso.so.dbg.raw: $(obj)/vdso.lds $(obj-vdso) FORCE
cdab7e2c 132 $(call if_changed,vdsold_and_vdso_check)
ebb5e78c 133
2afb9745
JH
134$(obj)/vdso-image.c: $(obj)/vdso.so.dbg.raw $(obj)/vdso.so.raw \
135 $(obj)/genvdso FORCE
ebb5e78c
AS
136 $(call if_changed,genvdso)
137
138obj-y += vdso-image.o
139
140#
141# Build O32 VDSO.
142#
143
144# Define these outside the ifdef to ensure they are picked up by clean.
145targets += $(obj-vdso-y:%.o=%-o32.o)
2afb9745
JH
146targets += vdso-o32.lds
147targets += vdso-o32.so.dbg.raw vdso-o32.so.raw
148targets += vdso-o32.so.dbg vdso-o32.so
149targets += vdso-o32-image.c
ebb5e78c
AS
150
151ifdef CONFIG_MIPS32_O32
152
153obj-vdso-o32 := $(obj-vdso-y:%.o=$(obj)/%-o32.o)
154
155$(obj-vdso-o32): KBUILD_CFLAGS := $(cflags-vdso) -mabi=32
156$(obj-vdso-o32): KBUILD_AFLAGS := $(aflags-vdso) -mabi=32
157
158$(obj)/%-o32.o: $(src)/%.S FORCE
b668970e 159 $(call if_changed_dep,vdsoas_o_S)
ebb5e78c
AS
160
161$(obj)/%-o32.o: $(src)/%.c FORCE
162 $(call cmd,force_checksrc)
163 $(call if_changed_rule,cc_o_c)
164
67fc5dc8 165$(obj)/vdso-o32.lds: KBUILD_CPPFLAGS := $(ccflags-vdso) -mabi=32
ebb5e78c
AS
166$(obj)/vdso-o32.lds: $(src)/vdso.lds.S FORCE
167 $(call if_changed_dep,cpp_lds_S)
168
2afb9745 169$(obj)/vdso-o32.so.dbg.raw: $(obj)/vdso-o32.lds $(obj-vdso-o32) FORCE
cdab7e2c 170 $(call if_changed,vdsold_and_vdso_check)
ebb5e78c
AS
171
172$(obj)/vdso-o32-image.c: VDSO_NAME := o32
2afb9745
JH
173$(obj)/vdso-o32-image.c: $(obj)/vdso-o32.so.dbg.raw $(obj)/vdso-o32.so.raw \
174 $(obj)/genvdso FORCE
ebb5e78c
AS
175 $(call if_changed,genvdso)
176
177obj-y += vdso-o32-image.o
178
179endif
180
181#
182# Build N32 VDSO.
183#
184
185targets += $(obj-vdso-y:%.o=%-n32.o)
2afb9745
JH
186targets += vdso-n32.lds
187targets += vdso-n32.so.dbg.raw vdso-n32.so.raw
188targets += vdso-n32.so.dbg vdso-n32.so
189targets += vdso-n32-image.c
ebb5e78c
AS
190
191ifdef CONFIG_MIPS32_N32
192
193obj-vdso-n32 := $(obj-vdso-y:%.o=$(obj)/%-n32.o)
194
195$(obj-vdso-n32): KBUILD_CFLAGS := $(cflags-vdso) -mabi=n32
196$(obj-vdso-n32): KBUILD_AFLAGS := $(aflags-vdso) -mabi=n32
197
198$(obj)/%-n32.o: $(src)/%.S FORCE
b668970e 199 $(call if_changed_dep,vdsoas_o_S)
ebb5e78c
AS
200
201$(obj)/%-n32.o: $(src)/%.c FORCE
202 $(call cmd,force_checksrc)
203 $(call if_changed_rule,cc_o_c)
204
67fc5dc8 205$(obj)/vdso-n32.lds: KBUILD_CPPFLAGS := $(ccflags-vdso) -mabi=n32
ebb5e78c
AS
206$(obj)/vdso-n32.lds: $(src)/vdso.lds.S FORCE
207 $(call if_changed_dep,cpp_lds_S)
208
2afb9745 209$(obj)/vdso-n32.so.dbg.raw: $(obj)/vdso-n32.lds $(obj-vdso-n32) FORCE
cdab7e2c 210 $(call if_changed,vdsold_and_vdso_check)
ebb5e78c
AS
211
212$(obj)/vdso-n32-image.c: VDSO_NAME := n32
2afb9745
JH
213$(obj)/vdso-n32-image.c: $(obj)/vdso-n32.so.dbg.raw $(obj)/vdso-n32.so.raw \
214 $(obj)/genvdso FORCE
ebb5e78c
AS
215 $(call if_changed,genvdso)
216
217obj-y += vdso-n32-image.o
218
219endif
220
221# FIXME: Need install rule for debug.
222# Needs to deal with dependency for generation of dbg by cmd_genvdso...