2019-06-21 10:52:37 +01:00
# SPDX-License-Identifier: GPL-2.0
#
# Makefile for vdso32
#
# Absolute relocation type $(ARCH_REL_TYPE_ABS) needs to be defined before
# the inclusion of generic Makefile.
ARCH_REL_TYPE_ABS := R_ARM_JUMP_SLOT| R_ARM_GLOB_DAT| R_ARM_ABS32
i n c l u d e $( srctree ) / l i b / v d s o / M a k e f i l e
2019-10-04 14:20:06 +01:00
# Same as cc-*option, but using CC_COMPAT instead of CC
2019-10-04 15:43:53 +01:00
i f e q ( $( CONFIG_CC_IS_CLANG ) , y )
2020-03-20 14:53:51 +00:00
COMPAT_GCC_TOOLCHAIN_DIR := $( dir $( shell which $( CROSS_COMPILE_COMPAT) elfedit) )
COMPAT_GCC_TOOLCHAIN := $( realpath $( COMPAT_GCC_TOOLCHAIN_DIR) /..)
CC_COMPAT_CLANG_FLAGS := --target= $( notdir $( CROSS_COMPILE_COMPAT:%-= %) )
CC_COMPAT_CLANG_FLAGS += --prefix= $( COMPAT_GCC_TOOLCHAIN_DIR)
CC_COMPAT_CLANG_FLAGS += -no-integrated-as -Qunused-arguments
i f n e q ( $( COMPAT_GCC_TOOLCHAIN ) , )
CC_COMPAT_CLANG_FLAGS += --gcc-toolchain= $( COMPAT_GCC_TOOLCHAIN)
e n d i f
2019-10-04 14:20:06 +01:00
CC_COMPAT ?= $( CC)
2020-03-20 14:53:51 +00:00
CC_COMPAT += $( CC_COMPAT_CLANG_FLAGS)
2019-10-04 15:43:53 +01:00
e l s e
2019-10-04 14:20:06 +01:00
CC_COMPAT ?= $( CROSS_COMPILE_COMPAT) gcc
2019-10-04 15:43:53 +01:00
e n d i f
2019-06-21 10:52:37 +01:00
cc32-option = $( call try-run,\
2019-10-04 14:20:06 +01:00
$( CC_COMPAT) $( 1) -c -x c /dev/null -o " $$ TMP " ,$( 1) ,$( 2) )
2019-06-21 10:52:37 +01:00
cc32-disable-warning = $( call try-run,\
2019-10-04 14:20:06 +01:00
$( CC_COMPAT) -W$( strip $( 1) ) -c -x c /dev/null -o " $$ TMP " ,-Wno-$( strip $( 1) ) )
2019-06-21 10:52:37 +01:00
cc32-ldoption = $( call try-run,\
2019-10-04 14:20:06 +01:00
$( CC_COMPAT) $( 1) -nostdlib -x c /dev/null -o " $$ TMP " ,$( 1) ,$( 2) )
2019-10-03 18:48:34 +01:00
cc32-as-instr = $( call try-run,\
2019-10-04 14:20:06 +01:00
printf "%b\n" " $( 1) " | $( CC_COMPAT) $( VDSO_AFLAGS) -c -x assembler -o " $$ TMP " -,$( 2) ,$( 3) )
2019-06-21 10:52:37 +01:00
# We cannot use the global flags to compile the vDSO files, the main reason
# being that the 32-bit compiler may be older than the main (64-bit) compiler
# and therefore may not understand flags set using $(cc-option ...). Besides,
# arch-specific options should be taken from the arm Makefile instead of the
# arm64 one.
# As a result we set our own flags here.
2019-10-04 15:44:45 +01:00
# KBUILD_CPPFLAGS and NOSTDINC_FLAGS from top-level Makefile
2019-10-04 14:20:06 +01:00
VDSO_CPPFLAGS := -D__KERNEL__ -nostdinc -isystem $( shell $( CC_COMPAT) -print-file-name= include)
2019-06-21 10:52:37 +01:00
VDSO_CPPFLAGS += $( LINUXINCLUDE)
# Common C and assembly flags
# From top-level Makefile
VDSO_CAFLAGS := $( VDSO_CPPFLAGS)
2019-10-04 14:20:06 +01:00
i f n e q ( $( shell $ ( CC_COMPAT ) --version 2>&1 | head -n 1 | grep clang ) , )
2019-10-07 12:27:59 +01:00
VDSO_CAFLAGS += --target= $( notdir $( CROSS_COMPILE_COMPAT:%-= %) )
e n d i f
2019-06-21 10:52:37 +01:00
VDSO_CAFLAGS += $( call cc32-option,-fno-PIE)
i f d e f C O N F I G _ D E B U G _ I N F O
VDSO_CAFLAGS += -g
e n d i f
# From arm Makefile
VDSO_CAFLAGS += $( call cc32-option,-fno-dwarf2-cfi-asm)
VDSO_CAFLAGS += -mabi= aapcs-linux -mfloat-abi= soft
i f e q ( $( CONFIG_CPU_BIG_ENDIAN ) , y )
VDSO_CAFLAGS += -mbig-endian
e l s e
VDSO_CAFLAGS += -mlittle-endian
e n d i f
# From arm vDSO Makefile
VDSO_CAFLAGS += -fPIC -fno-builtin -fno-stack-protector
VDSO_CAFLAGS += -DDISABLE_BRANCH_PROFILING
2019-10-03 18:48:34 +01:00
2019-06-21 10:52:37 +01:00
# Try to compile for ARMv8. If the compiler is too old and doesn't support it,
# fall back to v7. There is no easy way to check for what architecture the code
# is being compiled, so define a macro specifying that (see arch/arm/Makefile).
VDSO_CAFLAGS += $( call cc32-option,-march= armv8-a -D__LINUX_ARM_ARCH__= 8,\
-march= armv7-a -D__LINUX_ARM_ARCH__= 7)
VDSO_CFLAGS := $( VDSO_CAFLAGS)
VDSO_CFLAGS += -DENABLE_COMPAT_VDSO= 1
# KBUILD_CFLAGS from top-level Makefile
VDSO_CFLAGS += -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common \
-Werror-implicit-function-declaration \
-Wno-format-security \
-std= gnu89
VDSO_CFLAGS += -O2
# Some useful compiler-dependent flags from top-level Makefile
VDSO_CFLAGS += $( call cc32-option,-Wdeclaration-after-statement,)
VDSO_CFLAGS += $( call cc32-option,-Wno-pointer-sign)
VDSO_CFLAGS += $( call cc32-option,-fno-strict-overflow)
VDSO_CFLAGS += $( call cc32-option,-Werror= strict-prototypes)
VDSO_CFLAGS += $( call cc32-option,-Werror= date-time)
VDSO_CFLAGS += $( call cc32-option,-Werror= incompatible-pointer-types)
# The 32-bit compiler does not provide 128-bit integers, which are used in
# some headers that are indirectly included from the vDSO code.
# This hack makes the compiler happy and should trigger a warning/error if
# variables of such type are referenced.
VDSO_CFLAGS += -D__uint128_t= 'void*'
# Silence some warnings coming from headers that operate on long's
# (on GCC 4.8 or older, there is unfortunately no way to silence this warning)
VDSO_CFLAGS += $( call cc32-disable-warning,shift-count-overflow)
VDSO_CFLAGS += -Wno-int-to-pointer-cast
VDSO_AFLAGS := $( VDSO_CAFLAGS)
VDSO_AFLAGS += -D__ASSEMBLY__
2019-10-03 18:48:34 +01:00
# Check for binutils support for dmb ishld
dmbinstr := $( call cc32-as-instr,dmb ishld,-DCONFIG_AS_DMB_ISHLD= 1)
VDSO_CFLAGS += $( dmbinstr)
VDSO_AFLAGS += $( dmbinstr)
2019-06-21 10:52:37 +01:00
VDSO_LDFLAGS := $( VDSO_CPPFLAGS)
# From arm vDSO Makefile
VDSO_LDFLAGS += -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname= linux-vdso.so.1
VDSO_LDFLAGS += -Wl,-z,max-page-size= 4096 -Wl,-z,common-page-size= 4096
VDSO_LDFLAGS += -nostdlib -shared -mfloat-abi= soft
2019-07-13 13:01:10 +09:00
VDSO_LDFLAGS += -Wl,--hash-style= sysv
VDSO_LDFLAGS += -Wl,--build-id
2019-06-21 10:52:37 +01:00
VDSO_LDFLAGS += $( call cc32-ldoption,-fuse-ld= bfd)
# Borrow vdsomunge.c from the arm vDSO
# We have to use a relative path because scripts/Makefile.host prefixes
2020-02-02 01:49:24 +09:00
# $(hostprogs) with $(obj)
2019-06-21 10:52:37 +01:00
munge := ../../../arm/vdso/vdsomunge
2020-02-02 01:49:24 +09:00
hostprogs := $( munge)
2019-06-21 10:52:37 +01:00
c-obj-vdso := note.o
c-obj-vdso-gettimeofday := vgettimeofday.o
asm-obj-vdso := sigreturn.o
i f n e q ( $( c -gettimeofday -y ) , )
VDSO_CFLAGS_gettimeofday_o += -include $( c-gettimeofday-y)
e n d i f
VDSO_CFLAGS_REMOVE_vgettimeofday.o = $( CC_FLAGS_FTRACE) -Os
# Build rules
targets := $( c-obj-vdso) $( c-obj-vdso-gettimeofday) $( asm-obj-vdso) vdso.so vdso.so.dbg vdso.so.raw
c-obj-vdso := $( addprefix $( obj) /, $( c-obj-vdso) )
c-obj-vdso-gettimeofday := $( addprefix $( obj) /, $( c-obj-vdso-gettimeofday) )
asm-obj-vdso := $( addprefix $( obj) /, $( asm-obj-vdso) )
obj-vdso := $( c-obj-vdso) $( c-obj-vdso-gettimeofday) $( asm-obj-vdso)
obj-y += vdso.o
extra-y += vdso.lds
CPPFLAGS_vdso.lds += -P -C -U$( ARCH)
# Force dependency (vdso.s includes vdso.so through incbin)
$(obj)/vdso.o : $( obj ) /vdso .so
include/generated/vdso32-offsets.h : $( obj ) /vdso .so .dbg FORCE
$( call if_changed,vdsosym)
# Strip rule for vdso.so
$(obj)/vdso.so : OBJCOPYFLAGS := -S
$(obj)/vdso.so : $( obj ) /vdso .so .dbg FORCE
$( call if_changed,objcopy)
$(obj)/vdso.so.dbg : $( obj ) /vdso .so .raw $( obj ) /$( munge ) FORCE
$( call if_changed,vdsomunge)
# Link rule for the .so file, .lds has to be first
$(obj)/vdso.so.raw : $( src ) /vdso .lds $( obj -vdso ) FORCE
2019-07-12 19:15:56 +09:00
$( call if_changed,vdsold_and_vdso_check)
2019-06-21 10:52:37 +01:00
# Compilation rules for the vDSO sources
$(c-obj-vdso) : %.o : %.c FORCE
$( call if_changed_dep,vdsocc)
$(c-obj-vdso-gettimeofday) : %.o : %.c FORCE
$( call if_changed_dep,vdsocc_gettimeofday)
$(asm-obj-vdso) : %.o : %.S FORCE
$( call if_changed_dep,vdsoas)
# Actual build commands
2019-07-19 11:10:18 +01:00
quiet_cmd_vdsold_and_vdso_check = LD32 $@
2019-07-12 19:15:56 +09:00
cmd_vdsold_and_vdso_check = $( cmd_vdsold) ; $( cmd_vdso_check)
2019-07-19 11:10:18 +01:00
quiet_cmd_vdsold = LD32 $@
2019-10-04 14:20:06 +01:00
cmd_vdsold = $( CC_COMPAT) -Wp,-MD,$( depfile) $( VDSO_LDFLAGS) \
2019-06-21 10:52:37 +01:00
-Wl,-T $( filter %.lds,$^) $( filter %.o,$^) -o $@
2019-07-19 11:10:18 +01:00
quiet_cmd_vdsocc = CC32 $@
2019-10-04 14:20:06 +01:00
cmd_vdsocc = $( CC_COMPAT) -Wp,-MD,$( depfile) $( VDSO_CFLAGS) -c -o $@ $<
2019-07-19 11:10:18 +01:00
quiet_cmd_vdsocc_gettimeofday = CC32 $@
2019-10-04 14:20:06 +01:00
cmd_vdsocc_gettimeofday = $( CC_COMPAT) -Wp,-MD,$( depfile) $( VDSO_CFLAGS) $( VDSO_CFLAGS_gettimeofday_o) -c -o $@ $<
2019-07-19 11:10:18 +01:00
quiet_cmd_vdsoas = AS32 $@
2019-10-04 14:20:06 +01:00
cmd_vdsoas = $( CC_COMPAT) -Wp,-MD,$( depfile) $( VDSO_AFLAGS) -c -o $@ $<
2019-06-21 10:52:37 +01:00
quiet_cmd_vdsomunge = MUNGE $@
cmd_vdsomunge = $( obj) /$( munge) $< $@
# Generate vDSO offsets using helper script (borrowed from the 64-bit vDSO)
gen-vdsosym := $( srctree) /$( src) /../vdso/gen_vdso_offsets.sh
quiet_cmd_vdsosym = VDSOSYM $@
# The AArch64 nm should be able to read an AArch32 binary
cmd_vdsosym = $( NM) $< | $( gen-vdsosym) | LC_ALL = C sort > $@
# Install commands for the unstripped file
quiet_cmd_vdso_install = INSTALL $@
cmd_vdso_install = cp $( obj) /$@ .dbg $( MODLIB) /vdso/vdso32.so
vdso.so : $( obj ) /vdso .so .dbg
@mkdir -p $( MODLIB) /vdso
$( call cmd,vdso_install)
vdso_install : vdso .so