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/' \
51
	-e 's/^\([0-9a-fA-F]*\) . \(VDSO[a-zA-Z0-9_]*\)$$/\2 = 0x\1;/p'
52
quiet_cmd_vdsosym = VDSOSYM $@
53 54 55
define cmd_vdsosym
	$(NM) $< | LC_ALL=C sed -n $(sed-vdsosym) | LC_ALL=C sort > $@
endef
56 57 58 59

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

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

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

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

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

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

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

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

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

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