#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # Patching a module, where the patched code references a vmlinux symbol which # needs a klp relocation. # # The kernel does not allow a module-targeted klp relocation to reference a # vmlinux symbol, and a symbol exported with EXPORT_SYMBOL_FOR_MODULES gets a # klp relocation. Put together, filing that relocation under the patched # module produces a patch the kernel refuses to apply to its target. # # So it goes under vmlinux instead, and is applied when the patch module loads # rather than when the patched module does. That is the opposite of the rule # for a reference to a module's symbol, which test-module-object covers; this # is the other branch of the same decision. . "$(dirname "$0")/../lib.sh" setup # The object being patched is a module ... build_module_pair cross_module.c klp_testmod # ... and the symbol it references belongs to vmlinux, exported in a way that # still requires a klp relocation. export_syms add_exports_ns vmlinux module:kvm other_mod_func run_diff # Filed against vmlinux, applied when the patch loads. assert_section __klp_relocs.vmlinux assert_klp_sym other_mod_func vmlinux # Not against the patched module: that is the relocation the kernel rejects. assert_no_section __klp_relocs.klp_testmod run_post_link assert_klp_rela vmlinux .text.target assert_no_section ".klp.rela.klp_testmod..text.target" pass "klp relocation to a vmlinux symbol filed under vmlinux, not the patched module"