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/riscv/Kconfig | 1 + arch/riscv/kernel/vdso/Makefile | 4 ++-- lib/vdso/check/vdsocheck.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index f8e26c4bed2b..f580d2afecf7 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -229,6 +229,7 @@ config RISCV select THREAD_INFO_IN_TASK select TRACE_IRQFLAGS_SUPPORT select UACCESS_MEMCPY if !MMU + select VDSO_CHECK if MMU select VDSO_DATASTORE if MMU select VDSO_GETRANDOM if MMU && 64BIT select USER_STACKTRACE_SUPPORT diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile index 8dbf2532a573..7e707fdff26c 100644 --- a/arch/riscv/kernel/vdso/Makefile +++ b/arch/riscv/kernel/vdso/Makefile @@ -74,7 +74,7 @@ endif $(obj)/$(vdso_o): $(obj)/$(vdso_so) # link rule for the .so file, .lds has to be first -$(obj)/$(vdso_so_dbg): $(obj)/$(vdso_lds) $(obj-vdso) FORCE +$(obj)/$(vdso_so_dbg): $(obj)/$(vdso_lds) $(obj-vdso) $(vdsocheck) FORCE $(call if_changed,vdsold_and_check) LDFLAGS_$(vdso_so_dbg) = -shared -soname=linux-vdso.so.1 \ --build-id=sha1 --eh-frame-hdr @@ -96,7 +96,7 @@ include/generated/$(vdso_offsets): $(obj)/$(vdso_so_dbg) FORCE # The DSO images are built using a special linker script # Make sure only to export the intended __vdso_xxx symbol offsets. quiet_cmd_vdsold_and_check = VDSOLD $@ - cmd_vdsold_and_check = $(LD) $(CFI_FULL) $(ld_flags) -T $(filter-out FORCE,$^) -o [email protected] && \ + cmd_vdsold_and_check = $(LD) $(CFI_FULL) $(ld_flags) -T $(filter-out FORCE $(vdsocheck),$^) -o [email protected] && \ $(OBJCOPY) $(patsubst %, -G __vdso_%, $(vdso-syms)) [email protected] $@ && \ rm [email protected] && \ $(cmd_vdso_check) diff --git a/lib/vdso/check/vdsocheck.rs b/lib/vdso/check/vdsocheck.rs index 429bdcd65818..67562d21f877 100644 --- a/lib/vdso/check/vdsocheck.rs +++ b/lib/vdso/check/vdsocheck.rs @@ -96,6 +96,32 @@ fn allowed_relocations_for_machine(machine: u16) -> Option<AllowedRelocations<'s ..Default::default() } .into(), + bindings::EM_RISCV => AllowedRelocations { + in_object_file: &[ + bindings::R_RISCV_BRANCH, + bindings::R_RISCV_JAL, + bindings::R_RISCV_CALL, + bindings::R_RISCV_CALL_PLT, + bindings::R_RISCV_PCREL_HI20, + bindings::R_RISCV_PCREL_LO12_I, + bindings::R_RISCV_PCREL_LO12_S, + bindings::R_RISCV_ADD8, + bindings::R_RISCV_ADD16, + bindings::R_RISCV_ADD32, + bindings::R_RISCV_ADD64, + bindings::R_RISCV_SUB8, + bindings::R_RISCV_SUB16, + bindings::R_RISCV_SUB32, + bindings::R_RISCV_SUB64, + bindings::R_RISCV_ALIGN, + bindings::R_RISCV_RVC_BRANCH, + bindings::R_RISCV_RVC_JUMP, + bindings::R_RISCV_RELAX, + bindings::R_RISCV_32_PCREL, + ], + ..Default::default() + } + .into(), _ => None, } } -- 2.55.0
