Makefile 4.0 KB
Newer Older
1
#
R
Roland McGrath 已提交
2
# Building vDSO images for x86.
3 4
#

R
Roland McGrath 已提交
5 6 7 8 9
VDSO64-$(CONFIG_X86_64)		:= y
VDSO32-$(CONFIG_X86_32)		:= y
VDSO32-$(CONFIG_COMPAT)		:= y

vdso-install-$(VDSO64-y)	+= vdso.so
R
Roland McGrath 已提交
10
vdso-install-$(VDSO32-y)	+= $(vdso32-images)
R
Roland McGrath 已提交
11 12


13
# files to link into the vdso
R
Roland McGrath 已提交
14
vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o vvar.o
15 16

# files to link into kernel
R
Roland McGrath 已提交
17
obj-$(VDSO64-y)			+= vma.o vdso.o
R
Roland McGrath 已提交
18
obj-$(VDSO32-y)			+= vdso32.o vdso32-setup.o
19 20 21 22 23

vobjs := $(foreach F,$(vobjs-y),$(obj)/$F)

$(obj)/vdso.o: $(obj)/vdso.so

R
Roland McGrath 已提交
24
targets += vdso.so vdso.so.dbg vdso.lds $(vobjs-y)
25

26
export CPPFLAGS_vdso.lds += -P -C
27

R
Roland McGrath 已提交
28 29
VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -Wl,-soname=linux-vdso.so.1 \
		      	-Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
30 31 32

$(obj)/vdso.o: $(src)/vdso.S $(obj)/vdso.so

33
$(obj)/vdso.so.dbg: $(src)/vdso.lds $(vobjs) FORCE
R
Roland McGrath 已提交
34
	$(call if_changed,vdso)
35

36 37 38 39
$(obj)/%.so: OBJCOPYFLAGS := -S
$(obj)/%.so: $(obj)/%.so.dbg FORCE
	$(call if_changed,objcopy)

40
CFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \
T
Tejun Heo 已提交
41
       $(filter -g%,$(KBUILD_CFLAGS)) $(call cc-option, -fno-stack-protector)
42

43
$(vobjs): KBUILD_CFLAGS += $(CFL)
44

45
targets += vdso-syms.lds
R
Roland McGrath 已提交
46
obj-$(VDSO64-y)			+= vdso-syms.lds
47 48 49 50 51

#
# Match symbols in the DSO that look like VDSO*; produce a file of constants.
#
sed-vdsosym := -e 's/^00*/0/' \
52
	-e 's/^\([0-9a-fA-F]*\) . \(VDSO[a-zA-Z0-9_]*\)$$/\2 = 0x\1;/p'
53
quiet_cmd_vdsosym = VDSOSYM $@
54 55 56
define cmd_vdsosym
	$(NM) $< | LC_ALL=C sed -n $(sed-vdsosym) | LC_ALL=C sort > $@
endef
57 58 59 60

$(obj)/%-syms.lds: $(obj)/%.so.dbg FORCE
	$(call if_changed,vdsosym)

R
Roland McGrath 已提交
61 62 63
#
# Build multiple 32-bit vDSO images to choose from at boot time.
#
R
Roland McGrath 已提交
64
obj-$(VDSO32-y)			+= vdso32-syms.lds
65
vdso32.so-$(VDSO32-y)		+= int80
66
vdso32.so-$(CONFIG_COMPAT)	+= syscall
R
Roland McGrath 已提交
67 68
vdso32.so-$(VDSO32-y)		+= sysenter

R
Roland McGrath 已提交
69 70
vdso32-images			= $(vdso32.so-y:%=vdso32-%.so)

R
Roland McGrath 已提交
71 72 73 74 75 76 77 78
CPPFLAGS_vdso32.lds = $(CPPFLAGS_vdso.lds)
VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -Wl,-soname=linux-gate.so.1

# This makes sure the $(obj) subdirectory exists even though vdso32/
# is not a kbuild sub-make subdirectory.
override obj-dirs = $(dir $(obj)) $(obj)/vdso32/

targets += vdso32/vdso32.lds
R
Roland McGrath 已提交
79
targets += $(vdso32-images) $(vdso32-images:=.dbg)
R
Roland McGrath 已提交
80 81
targets += vdso32/note.o $(vdso32.so-y:%=vdso32/%.o)

R
Roland McGrath 已提交
82
extra-y	+= $(vdso32-images)
R
Roland McGrath 已提交
83

R
Roland McGrath 已提交
84
$(obj)/vdso32.o: $(vdso32-images:%=$(obj)/%)
R
Roland McGrath 已提交
85

R
Roland McGrath 已提交
86
KBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS))
R
Roland McGrath 已提交
87 88
$(vdso32-images:%=$(obj)/%.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_32)
$(vdso32-images:%=$(obj)/%.dbg): asflags-$(CONFIG_X86_64) += -m32
R
Roland McGrath 已提交
89

R
Roland McGrath 已提交
90 91 92 93
$(vdso32-images:%=$(obj)/%.dbg): $(obj)/vdso32-%.so.dbg: FORCE \
				 $(obj)/vdso32/vdso32.lds \
				 $(obj)/vdso32/note.o \
				 $(obj)/vdso32/%.o
R
Roland McGrath 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
	$(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 $@
define cmd_vdso32sym
	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
endef

$(obj)/vdso32-syms.lds: $(vdso32.so-y:%=$(obj)/vdso32-%-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))) \
		       -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^)

VDSO_LDFLAGS = -fPIC -shared $(call ld-option, -Wl$(comma)--hash-style=sysv)

#
# Install the unstripped copy of vdso*.so listed in $(vdso-install-y).
#
130 131
quiet_cmd_vdso_install = INSTALL $@
      cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@
R
Roland McGrath 已提交
132
$(vdso-install-y): %.so: $(obj)/%.so.dbg FORCE
133 134 135
	@mkdir -p $(MODLIB)/vdso
	$(call cmd,vdso_install)

R
Roland McGrath 已提交
136 137
PHONY += vdso_install $(vdso-install-y)
vdso_install: $(vdso-install-y)
S
Sam Ravnborg 已提交
138 139

clean-files := vdso32-syscall* vdso32-sysenter* vdso32-int80*