Skip to content
Permalink
Browse files
livepatch/selftests: add __asm__ symbol renaming examples
GCC can rename symbols like static data and optimized functions, adding
a suffix that includes illegal C characters.  Extend the klp-convert
examples to demonstrate how to use __asm__ renaming from C code to
create klp-relocations to such renamed symbols.

Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
  • Loading branch information
joe-lawrence authored and intel-lab-lkp committed Feb 16, 2022
1 parent 0050faf commit 290c0e05d31c5bae75aede8758efb48f52751fea
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 0 deletions.
@@ -10,5 +10,7 @@ extern char driver_name[];
extern char homonym_string[];
extern const char *get_homonym_string(void);
extern const char *test_klp_get_driver_name(void);
extern char klp_string_a[] __asm__("klp_string.12345");
extern char klp_string_b[] __asm__("klp_string.67890");

#endif
@@ -25,13 +25,20 @@ void print_homonym_string(void)
pr_info("get_homonym_string(), 1: %s\n", get_homonym_string());
}

void print_static_strings(void)
{
pr_info("klp_string.12345 = %s\n", klp_string_a);
pr_info("klp_string.67890 = %s\n", klp_string_b);
}

/* provide a sysfs handle to invoke debug functions */
static int print_debug;
static int print_debug_set(const char *val, const struct kernel_param *kp)
{
print_saved_command_line();
print_driver_name();
print_homonym_string();
print_static_strings();

return 0;
}
@@ -67,6 +74,7 @@ KLP_MODULE_RELOC(test_klp_convert_mod) test_klp_convert_mod_relocs_a[] = {
KLP_SYMPOS(homonym_string, 1),
KLP_SYMPOS(get_homonym_string, 1),
KLP_SYMPOS(test_klp_get_driver_name, 0),
KLP_SYMPOS(klp_string_b, 1),
};

static struct klp_func funcs[] = {
@@ -20,6 +20,12 @@ __used static const char *get_homonym_string(void)
return homonym_string;
}

__used static void static_string_function(void)
{
__used static char klp_string[] __asm__("klp_string.12345") =
__FILE__ " static string";
}

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Joe Lawrence <joe.lawrence@redhat.com>");
MODULE_DESCRIPTION("Livepatch test: klp-convert module");
@@ -11,3 +11,9 @@ __used static const char *get_homonym_string(void)
{
return homonym_string;
}

__used static void static_string_function(void)
{
__used static char klp_string[] __asm__("klp_string.67890") =
__FILE__ " static string";
}
@@ -200,6 +200,8 @@ $MOD_KLP_CONVERT1: driver_name, 0: $MOD_KLP_CONVERT_MOD
$MOD_KLP_CONVERT1: test_klp_get_driver_name(), 0: $MOD_KLP_CONVERT_MOD
$MOD_KLP_CONVERT1: homonym_string, 1: homonym string A
$MOD_KLP_CONVERT1: get_homonym_string(), 1: homonym string A
test_klp_convert1: klp_string.12345 = lib/livepatch/test_klp_convert_mod_a.c static string
test_klp_convert1: klp_string.67890 = lib/livepatch/test_klp_convert_mod_b.c static string
% echo 0 > /sys/kernel/livepatch/$MOD_KLP_CONVERT1/enabled
livepatch: '$MOD_KLP_CONVERT1': initializing unpatching transition
livepatch: '$MOD_KLP_CONVERT1': starting unpatching transition
@@ -265,6 +267,8 @@ $MOD_KLP_CONVERT1: driver_name, 0: $MOD_KLP_CONVERT_MOD
$MOD_KLP_CONVERT1: test_klp_get_driver_name(), 0: $MOD_KLP_CONVERT_MOD
$MOD_KLP_CONVERT1: homonym_string, 1: homonym string A
$MOD_KLP_CONVERT1: get_homonym_string(), 1: homonym string A
test_klp_convert1: klp_string.12345 = lib/livepatch/test_klp_convert_mod_a.c static string
test_klp_convert1: klp_string.67890 = lib/livepatch/test_klp_convert_mod_b.c static string
% echo 0 > /sys/kernel/livepatch/$MOD_KLP_CONVERT1/enabled
livepatch: '$MOD_KLP_CONVERT1': initializing unpatching transition
livepatch: '$MOD_KLP_CONVERT1': starting unpatching transition

0 comments on commit 290c0e0

Please sign in to comment.