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 --- arch/powerpc/Kconfig | 1 + arch/powerpc/kernel/vdso/Makefile | 4 ++-- lib/vdso/check/vdsocheck.rs | 27 +++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 2580e27e4328..f19e225cfc5c 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -330,6 +330,7 @@ config PPC select SYSCTL_EXCEPTION_TRACE select THREAD_INFO_IN_TASK select TRACE_IRQFLAGS_SUPPORT + select VDSO_CHECK select VDSO_DATASTORE select VDSO_GETRANDOM # diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile index 368759f81708..ca20b91b4373 100644 --- a/arch/powerpc/kernel/vdso/Makefile +++ b/arch/powerpc/kernel/vdso/Makefile @@ -81,9 +81,9 @@ targets += vdso64.lds CPPFLAGS_vdso64.lds += -P -C # link rule for the .so file, .lds has to be first -$(obj)/vdso32.so.dbg: $(obj)/vdso32.lds $(obj-vdso32) $(obj)/vgettimeofday-32.o $(obj)/vgetrandom-32.o $(obj)/crtsavres-32.o FORCE +$(obj)/vdso32.so.dbg: $(obj)/vdso32.lds $(obj-vdso32) $(obj)/vgettimeofday-32.o $(obj)/vgetrandom-32.o $(obj)/crtsavres-32.o $(vdsocheck) FORCE $(call if_changed,vdso32ld_and_check) -$(obj)/vdso64.so.dbg: $(obj)/vdso64.lds $(obj-vdso64) $(obj)/vgettimeofday-64.o $(obj)/vgetrandom-64.o FORCE +$(obj)/vdso64.so.dbg: $(obj)/vdso64.lds $(obj-vdso64) $(obj)/vgettimeofday-64.o $(obj)/vgetrandom-64.o $(vdsocheck) FORCE $(call if_changed,vdso64ld_and_check) # assembly rules for the .S files diff --git a/lib/vdso/check/vdsocheck.rs b/lib/vdso/check/vdsocheck.rs index e45a1fbc6829..429bdcd65818 100644 --- a/lib/vdso/check/vdsocheck.rs +++ b/lib/vdso/check/vdsocheck.rs @@ -69,6 +69,33 @@ fn allowed_relocations_for_machine(machine: u16) -> Option AllowedRelocations { + in_object_file: &[ + bindings::R_PPC_REL24, + bindings::R_PPC_REL14, + bindings::R_PPC_REL32, + bindings::R_PPC_REL16, + bindings::R_PPC_REL16_LO, + bindings::R_PPC_REL16_HI, + bindings::R_PPC_REL16_HA, + ], + ..Default::default() + } + .into(), + bindings::EM_PPC64 => AllowedRelocations { + in_object_file: &[ + bindings::R_PPC64_REL24, + bindings::R_PPC64_REL14, + bindings::R_PPC64_REL32, + bindings::R_PPC64_REL64, + bindings::R_PPC64_REL16, + bindings::R_PPC64_REL16_LO, + bindings::R_PPC64_REL16_HI, + bindings::R_PPC64_REL16_HA, + ], + ..Default::default() + } + .into(), _ => None, } } -- 2.55.0