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 -g0 -O2 -fasynchronous-unwind-tables -m64
41

R
Roland McGrath 已提交
42
$(vobjs): KBUILD_CFLAGS = $(CFL)
43

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

#
# Match symbols in the DSO that look like VDSO*; produce a file of constants.
#
sed-vdsosym := -e 's/^00*/0/' \
P
Priit Laes 已提交
51
	-e 's/^\([[:xdigit:]]*\) . \(VDSO[[:alnum:]_]*\)$$/\2 = 0x\1;/p'
52 53 54 55 56 57
quiet_cmd_vdsosym = VDSOSYM $@
      cmd_vdsosym = $(NM) $< | sed -n $(sed-vdsosym) | LC_ALL=C sort > $@

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

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

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

R
Roland McGrath 已提交
68 69 70 71 72 73 74 75
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 已提交
76
targets += $(vdso32-images) $(vdso32-images:=.dbg)
R
Roland McGrath 已提交
77 78
targets += vdso32/note.o $(vdso32.so-y:%=vdso32/%.o)

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

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

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

R
Roland McGrath 已提交
87 88 89 90
$(vdso32-images:%=$(obj)/%.dbg): $(obj)/vdso32-%.so.dbg: FORCE \
				 $(obj)/vdso32/vdso32.lds \
				 $(obj)/vdso32/note.o \
				 $(obj)/vdso32/%.o
R
Roland McGrath 已提交
91 92 93 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
	$(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).
#
127 128
quiet_cmd_vdso_install = INSTALL $@
      cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@
R
Roland McGrath 已提交
129
$(vdso-install-y): %.so: $(obj)/%.so.dbg FORCE
130 131 132
	@mkdir -p $(MODLIB)/vdso
	$(call cmd,vdso_install)

R
Roland McGrath 已提交
133 134
PHONY += vdso_install $(vdso-install-y)
vdso_install: $(vdso-install-y)
S
Sam Ravnborg 已提交
135 136

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