When building the 32-bit VDSO, we are building 32-bit code as part of
a 64-bit kernel build. That requires us to tweak the cflags to trick
the compiler into building 32-bit code for us. The main way we do that
is by passing -m32, but there are other options that affect code
generation and ABI selection.
In particular when building vgettimeofday.c, we end up passing
-mcall-aixdesc because it's in KBUILD_CFLAGS, which causes the
compiler to generate function descriptors, and dot symbols, eg:
  $ nm arch/powerpc/kernel/vdso32/vgettimeofday.o
  000005d0 T .__c_kernel_clock_getres
  00000024 D __c_kernel_clock_getres
  ...
We get away with that at the moment because we also use the DOTSYM
macro, and that is also incorrectly prepending a '.' in 32-bit VDSO
code due to a separate bug.
But we shouldn't be generating function descriptors for this file,
there's no 32-bit ABI that includes function descriptors, so the
resulting object file is some frankenstein and it's surprising that it
even links.
So filter out all the ABI-related options we add to CFLAGS for 64-bit
builds, so that they're not used when building 32-bit code. With that
we only see regular text symbols:
  $ nm arch/powerpc/kernel/vdso32/vgettimeofday.o                                                                                                                                     michael@alpine1-p1
  000005d0 T __c_kernel_clock_getres
  00000000 T __c_kernel_clock_gettime
  00000200 T __c_kernel_clock_gettime64
  00000410 T __c_kernel_gettimeofday
  00000650 T __c_kernel_time
Fixes: ab037dd87a ("powerpc/vdso: Switch VDSO to generic C implementation.")
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20201218111619.1206391-2-mpe@ellerman.id.au
		
	
			
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
# SPDX-License-Identifier: GPL-2.0
 | 
						|
 | 
						|
# List of files in the vdso, has to be asm only for now
 | 
						|
 | 
						|
ARCH_REL_TYPE_ABS := R_PPC_JUMP_SLOT|R_PPC_GLOB_DAT|R_PPC_ADDR32|R_PPC_ADDR24|R_PPC_ADDR16|R_PPC_ADDR16_LO|R_PPC_ADDR16_HI|R_PPC_ADDR16_HA|R_PPC_ADDR14|R_PPC_ADDR14_BRTAKEN|R_PPC_ADDR14_BRNTAKEN|R_PPC_REL24
 | 
						|
include $(srctree)/lib/vdso/Makefile
 | 
						|
 | 
						|
obj-vdso32 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o getcpu.o
 | 
						|
 | 
						|
ifneq ($(c-gettimeofday-y),)
 | 
						|
  CFLAGS_vgettimeofday.o += -include $(c-gettimeofday-y)
 | 
						|
  CFLAGS_vgettimeofday.o += $(DISABLE_LATENT_ENTROPY_PLUGIN)
 | 
						|
  CFLAGS_vgettimeofday.o += $(call cc-option, -fno-stack-protector)
 | 
						|
  CFLAGS_vgettimeofday.o += -DDISABLE_BRANCH_PROFILING
 | 
						|
  CFLAGS_vgettimeofday.o += -ffreestanding -fasynchronous-unwind-tables
 | 
						|
  CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE)
 | 
						|
endif
 | 
						|
 | 
						|
# Build rules
 | 
						|
 | 
						|
ifdef CROSS32_COMPILE
 | 
						|
    VDSOCC := $(CROSS32_COMPILE)gcc
 | 
						|
else
 | 
						|
    VDSOCC := $(CC)
 | 
						|
endif
 | 
						|
 | 
						|
CC32FLAGS :=
 | 
						|
ifdef CONFIG_PPC64
 | 
						|
CC32FLAGS += -m32
 | 
						|
KBUILD_CFLAGS := $(filter-out -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc,$(KBUILD_CFLAGS))
 | 
						|
endif
 | 
						|
 | 
						|
targets := $(obj-vdso32) vdso32.so.dbg
 | 
						|
obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
 | 
						|
 | 
						|
GCOV_PROFILE := n
 | 
						|
KCOV_INSTRUMENT := n
 | 
						|
UBSAN_SANITIZE := n
 | 
						|
KASAN_SANITIZE := n
 | 
						|
 | 
						|
ccflags-y := -shared -fno-common -fno-builtin -nostdlib \
 | 
						|
	-Wl,-soname=linux-vdso32.so.1 -Wl,--hash-style=both
 | 
						|
asflags-y := -D__VDSO32__ -s
 | 
						|
 | 
						|
obj-y += vdso32_wrapper.o
 | 
						|
targets += vdso32.lds
 | 
						|
CPPFLAGS_vdso32.lds += -P -C -Upowerpc
 | 
						|
 | 
						|
# Force dependency (incbin is bad)
 | 
						|
$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so.dbg
 | 
						|
 | 
						|
# link rule for the .so file, .lds has to be first
 | 
						|
$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) $(obj)/vgettimeofday.o FORCE
 | 
						|
	$(call if_changed,vdso32ld_and_check)
 | 
						|
 | 
						|
# assembly rules for the .S files
 | 
						|
$(obj-vdso32): %.o: %.S FORCE
 | 
						|
	$(call if_changed_dep,vdso32as)
 | 
						|
$(obj)/vgettimeofday.o: %.o: %.c FORCE
 | 
						|
	$(call if_changed_dep,vdso32cc)
 | 
						|
 | 
						|
# Generate VDSO offsets using helper script
 | 
						|
gen-vdsosym := $(srctree)/$(src)/gen_vdso_offsets.sh
 | 
						|
quiet_cmd_vdsosym = VDSOSYM $@
 | 
						|
      cmd_vdsosym = $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@
 | 
						|
 | 
						|
include/generated/vdso32-offsets.h: $(obj)/vdso32.so.dbg FORCE
 | 
						|
	$(call if_changed,vdsosym)
 | 
						|
 | 
						|
# actual build commands
 | 
						|
quiet_cmd_vdso32ld_and_check = VDSO32L $@
 | 
						|
      cmd_vdso32ld_and_check = $(VDSOCC) $(c_flags) $(CC32FLAGS) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^) ; $(cmd_vdso_check)
 | 
						|
quiet_cmd_vdso32as = VDSO32A $@
 | 
						|
      cmd_vdso32as = $(VDSOCC) $(a_flags) $(CC32FLAGS) -c -o $@ $<
 | 
						|
quiet_cmd_vdso32cc = VDSO32C $@
 | 
						|
      cmd_vdso32cc = $(VDSOCC) $(c_flags) $(CC32FLAGS) -c -o $@ $<
 |