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

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

vdso-install-$(VDSO64-y)	+= vdso.so
vdso-install-$(VDSO32-y)	+= $(vdso32-y:=.so)


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 27 28 29 30

# The DSO images are built using a special linker script.
quiet_cmd_syscall = SYSCALL $@
      cmd_syscall = $(CC) -m elf_x86_64 -nostdlib $(SYSCFLAGS_$(@F)) \
		          -Wl,-T,$(filter-out FORCE,$^) -o $@

31
export CPPFLAGS_vdso.lds += -P -C
32 33 34 35 36

vdso-flags = -fPIC -shared -Wl,-soname=linux-vdso.so.1 \
		 $(call ld-option, -Wl$(comma)--hash-style=sysv) \
		-Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
SYSCFLAGS_vdso.so = $(vdso-flags)
37
SYSCFLAGS_vdso.so.dbg = $(vdso-flags)
38 39 40 41

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

$(obj)/vdso.so: $(src)/vdso.lds $(vobjs) FORCE
42 43

$(obj)/vdso.so.dbg: $(src)/vdso.lds $(vobjs) FORCE
44 45
	$(call if_changed,syscall)

46 47 48 49
$(obj)/%.so: OBJCOPYFLAGS := -S
$(obj)/%.so: $(obj)/%.so.dbg FORCE
	$(call if_changed,objcopy)

50
CFL := $(PROFILING) -mcmodel=small -fPIC -g0 -O2 -fasynchronous-unwind-tables -m64
51

52 53
$(obj)/vclock_gettime.o: KBUILD_CFLAGS = $(CFL)
$(obj)/vgetcpu.o: KBUILD_CFLAGS = $(CFL)
54

55
targets += vdso-syms.lds
R
Roland McGrath 已提交
56
obj-$(VDSO64-y)			+= vdso-syms.lds
57 58 59 60 61 62 63 64 65 66 67 68

#
# Match symbols in the DSO that look like VDSO*; produce a file of constants.
#
sed-vdsosym := -e 's/^00*/0/' \
	-e 's/^\([0-9a-fA-F]*\) . \(VDSO[a-zA-Z0-9_]*\)$$/\2 = 0x\1;/p'
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 已提交
69 70 71
#
# Build multiple 32-bit vDSO images to choose from at boot time.
#
R
Roland McGrath 已提交
72
obj-$(VDSO32-y)			+= vdso32-syms.lds
R
Roland McGrath 已提交
73
vdso32.so-$(CONFIG_X86_32)	+= int80
74
vdso32.so-$(CONFIG_COMPAT)	+= syscall
R
Roland McGrath 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
vdso32.so-$(VDSO32-y)		+= sysenter

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
targets += $(vdso32.so-y:%=vdso32-%.so.dbg) $(vdso32.so-y:%=vdso32-%.so)
targets += vdso32/note.o $(vdso32.so-y:%=vdso32/%.o)

extra-y	+= $(vdso32.so-y:%=vdso32-%.so)

R
Roland McGrath 已提交
90 91
$(obj)/vdso32.o: $(vdso32.so-y:%=$(obj)/vdso32-%.so)

R
Roland McGrath 已提交
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 127 128 129 130 131 132 133 134 135
KBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS))
$(vdso32.so-y:%=$(obj)/vdso32-%.so.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_32)
$(vdso32.so-y:%=$(obj)/vdso32-%.so.dbg): asflags-$(CONFIG_X86_64) += -m32

$(vdso32.so-y:%=$(obj)/vdso32-%.so.dbg): $(obj)/vdso32-%.so.dbg: FORCE \
					 $(obj)/vdso32/vdso32.lds \
					 $(obj)/vdso32/note.o \
					 $(obj)/vdso32/%.o
	$(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).
#
136 137
quiet_cmd_vdso_install = INSTALL $@
      cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@
R
Roland McGrath 已提交
138
$(vdso-install-y): %.so: $(obj)/%.so.dbg FORCE
139 140 141
	@mkdir -p $(MODLIB)/vdso
	$(call cmd,vdso_install)

R
Roland McGrath 已提交
142 143
PHONY += vdso_install $(vdso-install-y)
vdso_install: $(vdso-install-y)