2007-07-21 19:10:01 +04:00
#
2008-01-30 15:30:42 +03:00
# Building vDSO images for x86.
2007-07-21 19:10:01 +04:00
#
2008-01-30 15:30:42 +03:00
VDSO64-$(CONFIG_X86_64) := y
2012-02-19 23:38:06 +04:00
VDSOX32-$(CONFIG_X86_X32_ABI) := y
2008-01-30 15:30:42 +03:00
VDSO32-$(CONFIG_X86_32) := y
VDSO32-$(CONFIG_COMPAT) := y
vdso-install-$(VDSO64-y) += vdso.so
2012-02-19 23:38:06 +04:00
vdso-install-$(VDSOX32-y) += vdsox32.so
2008-02-12 01:38:51 +03:00
vdso-install-$(VDSO32-y) += $( vdso32-images)
2008-01-30 15:30:42 +03:00
2007-07-21 19:10:01 +04:00
# files to link into the vdso
2011-05-23 17:31:24 +04:00
vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o
2007-07-21 19:10:01 +04:00
2012-02-19 23:38:06 +04:00
vobjs-$(VDSOX32-y) += $( vobjx32s-compat)
# Filter out x32 objects.
vobj64s := $( filter-out $( vobjx32s-compat) ,$( vobjs-y) )
2007-07-21 19:10:01 +04:00
# files to link into kernel
2008-01-30 15:30:42 +03:00
obj-$(VDSO64-y) += vma.o vdso.o
2012-02-19 23:38:06 +04:00
obj-$(VDSOX32-y) += vdsox32.o
2008-01-30 15:30:43 +03:00
obj-$(VDSO32-y) += vdso32.o vdso32-setup.o
2007-07-21 19:10:01 +04:00
2012-02-19 23:38:06 +04:00
vobjs := $( foreach F,$( vobj64s) ,$( obj) /$F )
2007-07-21 19:10:01 +04:00
$(obj)/vdso.o : $( obj ) /vdso .so
2008-01-30 15:30:41 +03:00
targets += vdso.so vdso.so.dbg vdso.lds $( vobjs-y)
2007-07-21 19:10:01 +04:00
2007-11-12 22:14:19 +03:00
export CPPFLAGS_vdso.lds += -P -C
2007-07-21 19:10:01 +04:00
2010-12-14 03:01:38 +03:00
VDSO_LDFLAGS_vdso.lds = -m64 -Wl,-soname= linux-vdso.so.1 \
2011-07-13 17:24:12 +04:00
-Wl,--no-undefined \
2008-01-30 15:30:44 +03:00
-Wl,-z,max-page-size= 4096 -Wl,-z,common-page-size= 4096
2007-07-21 19:10:01 +04:00
$(obj)/vdso.o : $( src ) /vdso .S $( obj ) /vdso .so
2007-10-17 20:04:32 +04:00
$(obj)/vdso.so.dbg : $( src ) /vdso .lds $( vobjs ) FORCE
2008-01-30 15:30:44 +03:00
$( call if_changed,vdso)
2007-07-21 19:10:01 +04:00
2007-10-17 20:04:32 +04:00
$(obj)/%.so : OBJCOPYFLAGS := -S
$(obj)/%.so : $( obj ) /%.so .dbg FORCE
$( call if_changed,objcopy)
2011-05-23 17:31:29 +04:00
#
# Don't omit frame pointers for ease of userspace debugging, but do
# optimize sibling calls.
#
2008-04-14 23:19:30 +04:00
CFL := $( PROFILING) -mcmodel= small -fPIC -O2 -fasynchronous-unwind-tables -m64 \
2011-05-23 17:31:29 +04:00
$( filter -g%,$( KBUILD_CFLAGS) ) $( call cc-option, -fno-stack-protector) \
-fno-omit-frame-pointer -foptimize-sibling-calls
2007-07-21 19:10:01 +04:00
2008-03-19 20:25:53 +03:00
$(vobjs) : KBUILD_CFLAGS += $( CFL )
2007-07-21 19:10:01 +04:00
2011-05-23 17:31:29 +04:00
#
# vDSO code runs in userspace and -pg doesn't help with profiling anyway.
#
CFLAGS_REMOVE_vdso-note.o = -pg
CFLAGS_REMOVE_vclock_gettime.o = -pg
CFLAGS_REMOVE_vgetcpu.o = -pg
CFLAGS_REMOVE_vvar.o = -pg
2008-01-30 15:30:40 +03:00
targets += vdso-syms.lds
2008-01-30 15:30:42 +03:00
obj-$(VDSO64-y) += vdso-syms.lds
2008-01-30 15:30:40 +03:00
#
# Match symbols in the DSO that look like VDSO*; produce a file of constants.
#
sed-vdsosym := -e 's/^00*/0/' \
2008-02-27 22:42:15 +03:00
-e 's/^\([0-9a-fA-F]*\) . \(VDSO[a-zA-Z0-9_]*\)$$/\2 = 0x\1;/p'
2008-01-30 15:30:40 +03:00
quiet_cmd_vdsosym = VDSOSYM $@
2008-02-27 22:42:15 +03:00
d e f i n e c m d _ v d s o s y m
$( NM) $< | LC_ALL = C sed -n $( sed-vdsosym) | LC_ALL = C sort > $@
e n d e f
2008-01-30 15:30:40 +03:00
$(obj)/%-syms.lds : $( obj ) /%.so .dbg FORCE
$( call if_changed,vdsosym)
2012-02-19 23:38:06 +04:00
#
# X32 processes use x32 vDSO to access 64bit kernel data.
#
# Build x32 vDSO image:
# 1. Compile x32 vDSO as 64bit.
# 2. Convert object files to x32.
# 3. Build x32 VDSO image with x32 objects, which contains 64bit codes
# so that it can reach 64bit address space with 64bit pointers.
#
targets += vdsox32-syms.lds
obj-$(VDSOX32-y) += vdsox32-syms.lds
CPPFLAGS_vdsox32.lds = $( CPPFLAGS_vdso.lds)
VDSO_LDFLAGS_vdsox32.lds = -Wl,-m,elf32_x86_64 \
-Wl,-soname= linux-vdso.so.1 \
-Wl,-z,max-page-size= 4096 \
-Wl,-z,common-page-size= 4096
vobjx32s-y := $( vobj64s:.o= -x32.o)
vobjx32s := $( foreach F,$( vobjx32s-y) ,$( obj) /$F )
# Convert 64bit object file to x32 for x32 vDSO.
quiet_cmd_x32 = X32 $@
cmd_x32 = $( OBJCOPY) -O elf32-x86-64 $< $@
$(obj)/%-x32.o : $( obj ) /%.o FORCE
$( call if_changed,x32)
targets += vdsox32.so vdsox32.so.dbg vdsox32.lds $( vobjx32s-y)
$(obj)/vdsox32.o : $( src ) /vdsox 32.S $( obj ) /vdsox 32.so
$(obj)/vdsox32.so.dbg : $( src ) /vdsox 32.lds $( vobjx 32s ) FORCE
$( call if_changed,vdso)
2008-01-30 15:30:42 +03:00
#
# Build multiple 32-bit vDSO images to choose from at boot time.
#
2008-01-30 15:30:42 +03:00
obj-$(VDSO32-y) += vdso32-syms.lds
2008-07-12 13:22:00 +04:00
vdso32.so-$(VDSO32-y) += int80
2008-01-30 15:30:43 +03:00
vdso32.so-$(CONFIG_COMPAT) += syscall
2008-01-30 15:30:42 +03:00
vdso32.so-$(VDSO32-y) += sysenter
2008-02-12 01:38:51 +03:00
vdso32-images = $( vdso32.so-y:%= vdso32-%.so)
2008-01-30 15:30:42 +03:00
CPPFLAGS_vdso32.lds = $( CPPFLAGS_vdso.lds)
2010-12-14 03:01:38 +03:00
VDSO_LDFLAGS_vdso32.lds = -m32 -Wl,-soname= linux-gate.so.1
2008-01-30 15:30:42 +03:00
# This makes sure the $(obj) subdirectory exists even though vdso32/
# is not a kbuild sub-make subdirectory.
o v e r r i d e obj-dirs = $( dir $( obj) ) $( obj) /vdso32/
targets += vdso32/vdso32.lds
2008-02-12 01:38:51 +03:00
targets += $( vdso32-images) $( vdso32-images:= .dbg)
2008-01-30 15:30:42 +03:00
targets += vdso32/note.o $( vdso32.so-y:%= vdso32/%.o)
2008-02-12 01:38:51 +03:00
extra-y += $( vdso32-images)
2008-01-30 15:30:42 +03:00
2008-02-12 01:38:51 +03:00
$(obj)/vdso32.o : $( vdso 32-images :%=$ ( obj ) /%)
2008-01-30 15:30:42 +03:00
2008-01-30 15:30:42 +03:00
KBUILD_AFLAGS_32 := $( filter-out -m64,$( KBUILD_AFLAGS) )
2008-02-12 01:38:51 +03:00
$(vdso32-images : %=$( obj ) /%.dbg ): KBUILD_AFLAGS = $( KBUILD_AFLAGS_ 32)
$(vdso32-images : %=$( obj ) /%.dbg ): asflags -$( CONFIG_X 86_ 64) += -m 32
2008-01-30 15:30:42 +03:00
2008-02-12 01:38:51 +03:00
$(vdso32-images : %=$( obj ) /%.dbg ): $( obj ) /vdso 32-%.so .dbg : FORCE \
$( obj) /vdso32/vdso32.lds \
$( obj) /vdso32/note.o \
$( obj) /vdso32/%.o
2008-01-30 15:30:42 +03:00
$( call if_changed,vdso)
# Make vdso32-*-syms.lds from each image, and then make sure they match.
# The only difference should be that some do not define VDSO32_SYSENTER_RETURN.
targets += vdso32-syms.lds $( vdso32.so-y:%= vdso32-%-syms.lds)
quiet_cmd_vdso32sym = VDSOSYM $@
d e f i n e c m d _ v d s o 3 2 s y m
if LC_ALL = C sort -u $( filter-out FORCE,$^) > $( @D) /.tmp_$( @F) && \
$( foreach H,$( filter-out FORCE,$^) ,\
if grep -q VDSO32_SYSENTER_RETURN $H ; \
then diff -u $( @D) /.tmp_$( @F) $H ; \
else sed /VDSO32_SYSENTER_RETURN/d $( @D) /.tmp_$( @F) | \
diff -u - $H ; fi && ) : ; \
then mv -f $( @D) /.tmp_$( @F) $@ ; \
else rm -f $( @D) /.tmp_$( @F) ; exit 1; \
fi
e n d e f
$(obj)/vdso32-syms.lds : $( vdso 32.so -y :%=$ ( obj ) /vdso 32-%-syms .lds ) FORCE
$( call if_changed,vdso32sym)
#
# The DSO images are built using a special linker script.
#
quiet_cmd_vdso = VDSO $@
cmd_vdso = $( CC) -nostdlib -o $@ \
$( VDSO_LDFLAGS) $( VDSO_LDFLAGS_$( filter %.lds,$( ^F) ) ) \
2010-06-19 01:36:26 +04:00
-Wl,-T,$( filter %.lds,$^) $( filter %.o,$^) && \
sh $( srctree) /$( src) /checkundef.sh '$(NM)' '$@'
2008-01-30 15:30:42 +03:00
2009-09-19 12:14:33 +04:00
VDSO_LDFLAGS = -fPIC -shared $( call cc-ldoption, -Wl$( comma) --hash-style= sysv)
2009-06-18 03:28:09 +04:00
GCOV_PROFILE := n
2008-01-30 15:30:42 +03:00
#
# Install the unstripped copy of vdso*.so listed in $(vdso-install-y).
#
2007-10-17 20:04:32 +04:00
quiet_cmd_vdso_install = INSTALL $@
cmd_vdso_install = cp $( obj) /$@ .dbg $( MODLIB) /vdso/$@
2008-01-30 15:30:42 +03:00
$(vdso-install-y) : %.so : $( obj ) /%.so .dbg FORCE
2007-10-17 20:04:32 +04:00
@mkdir -p $( MODLIB) /vdso
$( call cmd,vdso_install)
2008-01-30 15:30:42 +03:00
PHONY += vdso_install $( vdso-install-y)
vdso_install : $( vdso -install -y )
2008-01-30 15:32:27 +03:00
clean-files := vdso32-syscall* vdso32-sysenter* vdso32-int80*