static_call: Allow module use without exposing static_call_key
When exporting static_call_key; with EXPORT_STATIC_CALL*(), the module can use static_call_update() to change the function called. This is not desirable in general. Not exporting static_call_key however also disallows usage of static_call(), since objtool needs the key to construct the static_call_site. Solve this by allowing objtool to create the static_call_site using the trampoline address when it builds a module and cannot find the static_call_key symbol. The module loader will then try and map the trampole back to a key before it constructs the normal sites list. Doing this requires a trampoline -> key associsation, so add another magic section that keeps those. Originally-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lkml.kernel.org/r/20210127231837.ifddpn7rhwdaepiu@treble
This commit is contained in:
committed by
Ingo Molnar
parent
e59e10f8ef
commit
73f44fe19d
@@ -502,8 +502,21 @@ static int create_static_call_sections(struct objtool_file *file)
|
||||
|
||||
key_sym = find_symbol_by_name(file->elf, tmp);
|
||||
if (!key_sym) {
|
||||
WARN("static_call: can't find static_call_key symbol: %s", tmp);
|
||||
return -1;
|
||||
if (!module) {
|
||||
WARN("static_call: can't find static_call_key symbol: %s", tmp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* For modules(), the key might not be exported, which
|
||||
* means the module can make static calls but isn't
|
||||
* allowed to change them.
|
||||
*
|
||||
* In that case we temporarily set the key to be the
|
||||
* trampoline address. This is fixed up in
|
||||
* static_call_add_module().
|
||||
*/
|
||||
key_sym = insn->call_dest;
|
||||
}
|
||||
free(key_name);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user