1 # SPDX-License-Identifier: GPL-2.0
6 # Absolute relocation type $(ARCH_REL_TYPE_ABS) needs to be defined before
7 # the inclusion of generic Makefile.
8 ARCH_REL_TYPE_ABS
:= R_ARM_JUMP_SLOT|R_ARM_GLOB_DAT|R_ARM_ABS32
9 include $(srctree
)/lib
/vdso
/Makefile
11 # Same as cc-*option, but using CC_COMPAT instead of CC
12 ifeq ($(CONFIG_CC_IS_CLANG
), y
)
15 CC_COMPAT ?
= $(CROSS_COMPILE_COMPAT
)gcc
18 cc32-option
= $(call try-run
,\
19 $(CC_COMPAT
) $(1) -c
-x c
/dev
/null
-o
"$$TMP",$(1),$(2))
20 cc32-disable-warning
= $(call try-run
,\
21 $(CC_COMPAT
) -W
$(strip $(1)) -c
-x c
/dev
/null
-o
"$$TMP",-Wno-
$(strip $(1)))
22 cc32-ldoption
= $(call try-run
,\
23 $(CC_COMPAT
) $(1) -nostdlib
-x c
/dev
/null
-o
"$$TMP",$(1),$(2))
24 cc32-as-instr
= $(call try-run
,\
25 printf
"%b\n" "$(1)" |
$(CC_COMPAT
) $(VDSO_AFLAGS
) -c
-x assembler
-o
"$$TMP" -,$(2),$(3))
27 # We cannot use the global flags to compile the vDSO files, the main reason
28 # being that the 32-bit compiler may be older than the main (64-bit) compiler
29 # and therefore may not understand flags set using $(cc-option ...). Besides,
30 # arch-specific options should be taken from the arm Makefile instead of the
32 # As a result we set our own flags here.
34 # KBUILD_CPPFLAGS and NOSTDINC_FLAGS from top-level Makefile
35 VDSO_CPPFLAGS
:= -D__KERNEL__
-nostdinc
-isystem
$(shell $(CC_COMPAT
) -print-file-name
=include)
36 VDSO_CPPFLAGS
+= $(LINUXINCLUDE
)
38 # Common C and assembly flags
39 # From top-level Makefile
40 VDSO_CAFLAGS
:= $(VDSO_CPPFLAGS
)
41 ifneq ($(shell $(CC_COMPAT
) --version
2>&1 | head
-n
1 | grep clang
),)
42 VDSO_CAFLAGS
+= --target
=$(notdir $(CROSS_COMPILE_COMPAT
:%-=%))
45 VDSO_CAFLAGS
+= $(call cc32-option
,-fno-PIE
)
46 ifdef CONFIG_DEBUG_INFO
51 VDSO_CAFLAGS
+= $(call cc32-option
,-fno-dwarf2-cfi-asm
)
52 VDSO_CAFLAGS
+= -mabi
=aapcs-linux
-mfloat-abi
=soft
53 ifeq ($(CONFIG_CPU_BIG_ENDIAN
), y
)
54 VDSO_CAFLAGS
+= -mbig-endian
56 VDSO_CAFLAGS
+= -mlittle-endian
59 # From arm vDSO Makefile
60 VDSO_CAFLAGS
+= -fPIC
-fno-builtin
-fno-stack-protector
61 VDSO_CAFLAGS
+= -DDISABLE_BRANCH_PROFILING
64 # Try to compile for ARMv8. If the compiler is too old and doesn't support it,
65 # fall back to v7. There is no easy way to check for what architecture the code
66 # is being compiled, so define a macro specifying that (see arch/arm/Makefile).
67 VDSO_CAFLAGS
+= $(call cc32-option
,-march
=armv8-a
-D__LINUX_ARM_ARCH__
=8,\
68 -march
=armv7-a
-D__LINUX_ARM_ARCH__
=7)
70 VDSO_CFLAGS
:= $(VDSO_CAFLAGS
)
71 VDSO_CFLAGS
+= -DENABLE_COMPAT_VDSO
=1
72 # KBUILD_CFLAGS from top-level Makefile
73 VDSO_CFLAGS
+= -Wall
-Wundef
-Wstrict-prototypes
-Wno-trigraphs \
74 -fno-strict-aliasing
-fno-common \
75 -Werror-implicit-function-declaration \
76 -Wno-format-security \
79 # Some useful compiler-dependent flags from top-level Makefile
80 VDSO_CFLAGS
+= $(call cc32-option
,-Wdeclaration-after-statement
,)
81 VDSO_CFLAGS
+= $(call cc32-option
,-Wno-pointer-sign
)
82 VDSO_CFLAGS
+= $(call cc32-option
,-fno-strict-overflow
)
83 VDSO_CFLAGS
+= $(call cc32-option
,-Werror
=strict-prototypes
)
84 VDSO_CFLAGS
+= $(call cc32-option
,-Werror
=date-time
)
85 VDSO_CFLAGS
+= $(call cc32-option
,-Werror
=incompatible-pointer-types
)
87 # The 32-bit compiler does not provide 128-bit integers, which are used in
88 # some headers that are indirectly included from the vDSO code.
89 # This hack makes the compiler happy and should trigger a warning/error if
90 # variables of such type are referenced.
91 VDSO_CFLAGS
+= -D__uint128_t
='void*'
92 # Silence some warnings coming from headers that operate on long's
93 # (on GCC 4.8 or older, there is unfortunately no way to silence this warning)
94 VDSO_CFLAGS
+= $(call cc32-disable-warning
,shift-count-overflow
)
95 VDSO_CFLAGS
+= -Wno-int-to-pointer-cast
97 VDSO_AFLAGS
:= $(VDSO_CAFLAGS
)
98 VDSO_AFLAGS
+= -D__ASSEMBLY__
100 # Check for binutils support for dmb ishld
101 dmbinstr
:= $(call cc32-as-instr
,dmb ishld
,-DCONFIG_AS_DMB_ISHLD
=1)
103 VDSO_CFLAGS
+= $(dmbinstr
)
104 VDSO_AFLAGS
+= $(dmbinstr
)
106 VDSO_LDFLAGS
:= $(VDSO_CPPFLAGS
)
107 # From arm vDSO Makefile
108 VDSO_LDFLAGS
+= -Wl
,-Bsymbolic
-Wl
,--no-undefined
-Wl
,-soname
=linux-vdso.so
.1
109 VDSO_LDFLAGS
+= -Wl
,-z
,max-page-size
=4096 -Wl
,-z
,common-page-size
=4096
110 VDSO_LDFLAGS
+= -nostdlib
-shared
-mfloat-abi
=soft
111 VDSO_LDFLAGS
+= -Wl
,--hash-style
=sysv
112 VDSO_LDFLAGS
+= -Wl
,--build-id
113 VDSO_LDFLAGS
+= $(call cc32-ldoption
,-fuse-ld
=bfd
)
116 # Borrow vdsomunge.c from the arm vDSO
117 # We have to use a relative path because scripts/Makefile.host prefixes
118 # $(hostprogs-y) with $(obj)
119 munge
:= ..
/..
/..
/arm
/vdso
/vdsomunge
120 hostprogs-y
:= $(munge
)
123 c-obj-vdso-gettimeofday
:= vgettimeofday.o
124 asm-obj-vdso
:= sigreturn.o
126 ifneq ($(c-gettimeofday-y
),)
127 VDSO_CFLAGS_gettimeofday_o
+= -include $(c-gettimeofday-y
)
130 VDSO_CFLAGS_REMOVE_vgettimeofday.o
= $(CC_FLAGS_FTRACE
) -Os
133 targets
:= $(c-obj-vdso
) $(c-obj-vdso-gettimeofday
) $(asm-obj-vdso
) vdso.so vdso.so.dbg vdso.so.raw
134 c-obj-vdso
:= $(addprefix $(obj
)/, $(c-obj-vdso
))
135 c-obj-vdso-gettimeofday
:= $(addprefix $(obj
)/, $(c-obj-vdso-gettimeofday
))
136 asm-obj-vdso
:= $(addprefix $(obj
)/, $(asm-obj-vdso
))
137 obj-vdso
:= $(c-obj-vdso
) $(c-obj-vdso-gettimeofday
) $(asm-obj-vdso
)
141 CPPFLAGS_vdso.lds
+= -P
-C
-U
$(ARCH
)
143 # Force dependency (vdso.s includes vdso.so through incbin)
144 $(obj
)/vdso.o
: $(obj
)/vdso.so
146 include/generated
/vdso32-offsets.h
: $(obj
)/vdso.so.dbg FORCE
147 $(call if_changed
,vdsosym
)
149 # Strip rule for vdso.so
150 $(obj
)/vdso.so
: OBJCOPYFLAGS
:= -S
151 $(obj
)/vdso.so
: $(obj
)/vdso.so.dbg FORCE
152 $(call if_changed
,objcopy
)
154 $(obj
)/vdso.so.dbg
: $(obj
)/vdso.so.raw
$(obj
)/$(munge
) FORCE
155 $(call if_changed
,vdsomunge
)
157 # Link rule for the .so file, .lds has to be first
158 $(obj
)/vdso.so.raw
: $(src
)/vdso.lds
$(obj-vdso
) FORCE
159 $(call if_changed
,vdsold_and_vdso_check
)
161 # Compilation rules for the vDSO sources
162 $(c-obj-vdso
): %.o
: %.c FORCE
163 $(call if_changed_dep
,vdsocc
)
164 $(c-obj-vdso-gettimeofday
): %.o
: %.c FORCE
165 $(call if_changed_dep
,vdsocc_gettimeofday
)
166 $(asm-obj-vdso
): %.o
: %.S FORCE
167 $(call if_changed_dep
,vdsoas
)
169 # Actual build commands
170 quiet_cmd_vdsold_and_vdso_check
= LD32
$@
171 cmd_vdsold_and_vdso_check
= $(cmd_vdsold
); $(cmd_vdso_check
)
173 quiet_cmd_vdsold
= LD32
$@
174 cmd_vdsold
= $(CC_COMPAT
) -Wp
,-MD
,$(depfile
) $(VDSO_LDFLAGS
) \
175 -Wl
,-T
$(filter %.lds
,$^
) $(filter %.o
,$^
) -o
$@
176 quiet_cmd_vdsocc
= CC32
$@
177 cmd_vdsocc
= $(CC_COMPAT
) -Wp
,-MD
,$(depfile
) $(VDSO_CFLAGS
) -c
-o
$@
$<
178 quiet_cmd_vdsocc_gettimeofday
= CC32
$@
179 cmd_vdsocc_gettimeofday
= $(CC_COMPAT
) -Wp
,-MD
,$(depfile
) $(VDSO_CFLAGS
) $(VDSO_CFLAGS_gettimeofday_o
) -c
-o
$@
$<
180 quiet_cmd_vdsoas
= AS32
$@
181 cmd_vdsoas
= $(CC_COMPAT
) -Wp
,-MD
,$(depfile
) $(VDSO_AFLAGS
) -c
-o
$@
$<
183 quiet_cmd_vdsomunge
= MUNGE
$@
184 cmd_vdsomunge
= $(obj
)/$(munge
) $< $@
186 # Generate vDSO offsets using helper script (borrowed from the 64-bit vDSO)
187 gen-vdsosym
:= $(srctree
)/$(src
)/..
/vdso
/gen_vdso_offsets.sh
188 quiet_cmd_vdsosym
= VDSOSYM
$@
189 # The AArch64 nm should be able to read an AArch32 binary
190 cmd_vdsosym
= $(NM
) $< |
$(gen-vdsosym
) | LC_ALL
=C
sort > $@
192 # Install commands for the unstripped file
193 quiet_cmd_vdso_install
= INSTALL
$@
194 cmd_vdso_install
= cp
$(obj
)/$@.dbg
$(MODLIB
)/vdso
/vdso32.so
196 vdso.so
: $(obj
)/vdso.so.dbg
197 @mkdir
-p
$(MODLIB
)/vdso
198 $(call cmd
,vdso_install
)
200 vdso_install
: vdso.so