The vdsocheck tool validates the object files and final .so library. It can detect if the compiler created relocations which are incompatible with the vDSO which need to be worked around.
Wire it up for the architecture. Signed-off-by: Thomas Weißschuh <[email protected]> --- arch/s390/Kconfig | 1 + arch/s390/kernel/vdso/Makefile | 4 ++-- lib/vdso/check/vdsocheck.rs | 9 +++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 4b51bc6e8948..bc12367a7b00 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -291,6 +291,7 @@ config S390 select TRACE_IRQFLAGS_SUPPORT select TTY select USER_STACKTRACE_SUPPORT + select VDSO_CHECK select VDSO_GETRANDOM select VIRT_CPU_ACCOUNTING select VMAP_STACK diff --git a/arch/s390/kernel/vdso/Makefile b/arch/s390/kernel/vdso/Makefile index 35c834b895ec..509ef3f1e2eb 100644 --- a/arch/s390/kernel/vdso/Makefile +++ b/arch/s390/kernel/vdso/Makefile @@ -44,10 +44,10 @@ CPPFLAGS_vdso.lds += -P -C -U$(ARCH) $(obj)/vdso_wrapper.o : $(obj)/vdso.so quiet_cmd_vdso_and_check = VDSO $@ - cmd_vdso_and_check = $(cmd_ld); $(cmd_vdso_check) + cmd_vdso_and_check = $(cmd_ld_vdso); $(cmd_vdso_check) # link rule for the .so file, .lds has to be first -$(obj)/vdso.so.dbg: $(obj)/vdso.lds $(obj-vdso) $(obj-cvdso) FORCE +$(obj)/vdso.so.dbg: $(obj)/vdso.lds $(obj-vdso) $(obj-cvdso) $(vdsocheck) FORCE $(call if_changed,vdso_and_check) # strip rule for the .so file diff --git a/lib/vdso/check/vdsocheck.rs b/lib/vdso/check/vdsocheck.rs index 4aeb7094e552..b2135cf9add3 100644 --- a/lib/vdso/check/vdsocheck.rs +++ b/lib/vdso/check/vdsocheck.rs @@ -148,6 +148,15 @@ fn allowed_relocations_for_machine(machine: u16) -> Option<AllowedRelocations<'s ..Default::default() } .into(), + bindings::EM_S390 => AllowedRelocations { + in_object_file: &[ + bindings::R_390_PC32, + bindings::R_390_PC32DBL, + bindings::R_390_PLT32DBL, + ], + ..Default::default() + } + .into(), _ => None, } } -- 2.55.0
