linux/arch/x86/entry/vdso/Makefile
<<
>>
Prefs
   1# SPDX-License-Identifier: GPL-2.0
   2#
   3# Building vDSO images for x86.
   4#
   5
   6# Absolute relocation type $(ARCH_REL_TYPE_ABS) needs to be defined before
   7# the inclusion of generic Makefile.
   8ARCH_REL_TYPE_ABS := R_X86_64_JUMP_SLOT|R_X86_64_GLOB_DAT|R_X86_64_RELATIVE|
   9ARCH_REL_TYPE_ABS += R_386_GLOB_DAT|R_386_JMP_SLOT|R_386_RELATIVE
  10include $(srctree)/lib/vdso/Makefile
  11
  12KBUILD_CFLAGS += $(DISABLE_LTO)
  13KASAN_SANITIZE                  := n
  14UBSAN_SANITIZE                  := n
  15OBJECT_FILES_NON_STANDARD       := y
  16
  17# Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
  18KCOV_INSTRUMENT         := n
  19
  20VDSO64-$(CONFIG_X86_64)         := y
  21VDSOX32-$(CONFIG_X86_X32_ABI)   := y
  22VDSO32-$(CONFIG_X86_32)         := y
  23VDSO32-$(CONFIG_IA32_EMULATION) := y
  24
  25# files to link into the vdso
  26vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o
  27
  28# files to link into kernel
  29obj-y                           += vma.o
  30OBJECT_FILES_NON_STANDARD_vma.o := n
  31
  32# vDSO images to build
  33vdso_img-$(VDSO64-y)            += 64
  34vdso_img-$(VDSOX32-y)           += x32
  35vdso_img-$(VDSO32-y)            += 32
  36
  37obj-$(VDSO32-y)                 += vdso32-setup.o
  38
  39vobjs := $(foreach F,$(vobjs-y),$(obj)/$F)
  40
  41$(obj)/vdso.o: $(obj)/vdso.so
  42
  43targets += vdso.lds $(vobjs-y)
  44
  45# Build the vDSO image C files and link them in.
  46vdso_img_objs := $(vdso_img-y:%=vdso-image-%.o)
  47vdso_img_cfiles := $(vdso_img-y:%=vdso-image-%.c)
  48vdso_img_sodbg := $(vdso_img-y:%=vdso%.so.dbg)
  49obj-y += $(vdso_img_objs)
  50targets += $(vdso_img_cfiles)
  51targets += $(vdso_img_sodbg) $(vdso_img-y:%=vdso%.so)
  52
  53CPPFLAGS_vdso.lds += -P -C
  54
  55VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -soname linux-vdso.so.1 --no-undefined \
  56                        -z max-page-size=4096
  57
  58$(obj)/vdso64.so.dbg: $(obj)/vdso.lds $(vobjs) FORCE
  59        $(call if_changed,vdso_and_check)
  60
  61HOST_EXTRACFLAGS += -I$(srctree)/tools/include -I$(srctree)/include/uapi -I$(srctree)/arch/$(SUBARCH)/include/uapi
  62hostprogs-y                     += vdso2c
  63
  64quiet_cmd_vdso2c = VDSO2C  $@
  65      cmd_vdso2c = $(obj)/vdso2c $< $(<:%.dbg=%) $@
  66
  67$(obj)/vdso-image-%.c: $(obj)/vdso%.so.dbg $(obj)/vdso%.so $(obj)/vdso2c FORCE
  68        $(call if_changed,vdso2c)
  69
  70#
  71# Don't omit frame pointers for ease of userspace debugging, but do
  72# optimize sibling calls.
  73#
  74CFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \
  75       $(filter -g%,$(KBUILD_CFLAGS)) $(call cc-option, -fno-stack-protector) \
  76       -fno-omit-frame-pointer -foptimize-sibling-calls \
  77       -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO
  78
  79ifdef CONFIG_RETPOLINE
  80ifneq ($(RETPOLINE_VDSO_CFLAGS),)
  81  CFL += $(RETPOLINE_VDSO_CFLAGS)
  82endif
  83endif
  84
  85$(vobjs): KBUILD_CFLAGS := $(filter-out $(GCC_PLUGINS_CFLAGS) $(RETPOLINE_CFLAGS),$(KBUILD_CFLAGS)) $(CFL)
  86
  87#
  88# vDSO code runs in userspace and -pg doesn't help with profiling anyway.
  89#
  90CFLAGS_REMOVE_vdso-note.o = -pg
  91CFLAGS_REMOVE_vclock_gettime.o = -pg
  92CFLAGS_REMOVE_vgetcpu.o = -pg
  93CFLAGS_REMOVE_vvar.o = -pg
  94
  95#
  96# X32 processes use x32 vDSO to access 64bit kernel data.
  97#
  98# Build x32 vDSO image:
  99# 1. Compile x32 vDSO as 64bit.
 100# 2. Convert object files to x32.
 101# 3. Build x32 VDSO image with x32 objects, which contains 64bit codes
 102# so that it can reach 64bit address space with 64bit pointers.
 103#
 104
 105CPPFLAGS_vdsox32.lds = $(CPPFLAGS_vdso.lds)
 106VDSO_LDFLAGS_vdsox32.lds = -m elf32_x86_64 -soname linux-vdso.so.1 \
 107                           -z max-page-size=4096
 108
 109# x32-rebranded versions
 110vobjx32s-y := $(vobjs-y:.o=-x32.o)
 111
 112# same thing, but in the output directory
 113vobjx32s := $(foreach F,$(vobjx32s-y),$(obj)/$F)
 114
 115# Convert 64bit object file to x32 for x32 vDSO.
 116quiet_cmd_x32 = X32     $@
 117      cmd_x32 = $(OBJCOPY) -O elf32-x86-64 $< $@
 118
 119$(obj)/%-x32.o: $(obj)/%.o FORCE
 120        $(call if_changed,x32)
 121
 122targets += vdsox32.lds $(vobjx32s-y)
 123
 124$(obj)/%.so: OBJCOPYFLAGS := -S
 125$(obj)/%.so: $(obj)/%.so.dbg FORCE
 126        $(call if_changed,objcopy)
 127
 128$(obj)/vdsox32.so.dbg: $(obj)/vdsox32.lds $(vobjx32s) FORCE
 129        $(call if_changed,vdso_and_check)
 130
 131CPPFLAGS_vdso32.lds = $(CPPFLAGS_vdso.lds)
 132VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -soname linux-gate.so.1
 133
 134targets += vdso32/vdso32.lds
 135targets += vdso32/note.o vdso32/system_call.o vdso32/sigreturn.o
 136targets += vdso32/vclock_gettime.o
 137
 138KBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS)) -DBUILD_VDSO
 139$(obj)/vdso32.so.dbg: KBUILD_AFLAGS = $(KBUILD_AFLAGS_32)
 140$(obj)/vdso32.so.dbg: asflags-$(CONFIG_X86_64) += -m32
 141
 142KBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS))
 143KBUILD_CFLAGS_32 := $(filter-out -mcmodel=kernel,$(KBUILD_CFLAGS_32))
 144KBUILD_CFLAGS_32 := $(filter-out -fno-pic,$(KBUILD_CFLAGS_32))
 145KBUILD_CFLAGS_32 := $(filter-out -mfentry,$(KBUILD_CFLAGS_32))
 146KBUILD_CFLAGS_32 := $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS_32))
 147KBUILD_CFLAGS_32 := $(filter-out $(RETPOLINE_CFLAGS),$(KBUILD_CFLAGS_32))
 148KBUILD_CFLAGS_32 += -m32 -msoft-float -mregparm=0 -fpic
 149KBUILD_CFLAGS_32 += $(call cc-option, -fno-stack-protector)
 150KBUILD_CFLAGS_32 += $(call cc-option, -foptimize-sibling-calls)
 151KBUILD_CFLAGS_32 += -fno-omit-frame-pointer
 152KBUILD_CFLAGS_32 += -DDISABLE_BRANCH_PROFILING
 153
 154ifdef CONFIG_RETPOLINE
 155ifneq ($(RETPOLINE_VDSO_CFLAGS),)
 156  KBUILD_CFLAGS_32 += $(RETPOLINE_VDSO_CFLAGS)
 157endif
 158endif
 159
 160$(obj)/vdso32.so.dbg: KBUILD_CFLAGS = $(KBUILD_CFLAGS_32)
 161
 162$(obj)/vdso32.so.dbg: FORCE \
 163                      $(obj)/vdso32/vdso32.lds \
 164                      $(obj)/vdso32/vclock_gettime.o \
 165                      $(obj)/vdso32/note.o \
 166                      $(obj)/vdso32/system_call.o \
 167                      $(obj)/vdso32/sigreturn.o
 168        $(call if_changed,vdso_and_check)
 169
 170#
 171# The DSO images are built using a special linker script.
 172#
 173quiet_cmd_vdso = VDSO    $@
 174      cmd_vdso = $(LD) -nostdlib -o $@ \
 175                       $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \
 176                       -T $(filter %.lds,$^) $(filter %.o,$^) && \
 177                 sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
 178
 179VDSO_LDFLAGS = -shared --hash-style=both --build-id \
 180        $(call ld-option, --eh-frame-hdr) -Bsymbolic
 181GCOV_PROFILE := n
 182
 183quiet_cmd_vdso_and_check = VDSO    $@
 184      cmd_vdso_and_check = $(cmd_vdso); $(cmd_vdso_check)
 185
 186#
 187# Install the unstripped copies of vdso*.so.  If our toolchain supports
 188# build-id, install .build-id links as well.
 189#
 190quiet_cmd_vdso_install = INSTALL $(@:install_%=%)
 191define cmd_vdso_install
 192        cp $< "$(MODLIB)/vdso/$(@:install_%=%)"; \
 193        if readelf -n $< |grep -q 'Build ID'; then \
 194          buildid=`readelf -n $< |grep 'Build ID' |sed -e 's/^.*Build ID: \(.*\)$$/\1/'`; \
 195          first=`echo $$buildid | cut -b-2`; \
 196          last=`echo $$buildid | cut -b3-`; \
 197          mkdir -p "$(MODLIB)/vdso/.build-id/$$first"; \
 198          ln -sf "../../$(@:install_%=%)" "$(MODLIB)/vdso/.build-id/$$first/$$last.debug"; \
 199        fi
 200endef
 201
 202vdso_img_insttargets := $(vdso_img_sodbg:%.dbg=install_%)
 203
 204$(MODLIB)/vdso: FORCE
 205        @mkdir -p $(MODLIB)/vdso
 206
 207$(vdso_img_insttargets): install_%: $(obj)/%.dbg $(MODLIB)/vdso
 208        $(call cmd,vdso_install)
 209
 210PHONY += vdso_install $(vdso_img_insttargets)
 211vdso_install: $(vdso_img_insttargets)
 212
 213clean-files := vdso32.so vdso32.so.dbg vdso64* vdso-image-*.c vdsox32.so*
 214