Kernel commit 223b5e57d0d5 ("mm/execmem, arch: convert remaining
overrides of module_alloc to execmem") makes crash session loading
failure as below:

  # ./crash -s
  crash: seek error: kernel virtual address: ffffffff826bb418  type: 
"page_offset_base"

For X86 64 architecture, currently crash will search for symbol
"module_load_offset" to determine if the KASLR is enabled, and go
into the relevant code block. But the symbols "module_load_offset"
has been removed since Linux v6.10-rc1, which caused the current
failure.

And this issue can occur with live debugging and core dump file
debugging.

Let's check the symbol "kaslr_regions" instead of "module_load_offset"
to fix it.

Signed-off-by: Lianbo Jiang <liji...@redhat.com>
---
 symbols.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/symbols.c b/symbols.c
index b7627a83587a..1cdf21d86d69 100644
--- a/symbols.c
+++ b/symbols.c
@@ -619,9 +619,9 @@ strip_symbol_end(const char *name, char *buf)
  *  or in /proc/kallsyms on a live system.
  *
  *  Setting KASLR_CHECK will trigger a search for "module_load_offset"
- *  during the initial symbol sort operation, and if found, will
- *  set (RELOC_AUTO|KASLR).  On live systems, the search is done
- *  here by checking /proc/kallsyms.
+ *  or "kaslr_regions" during the initial symbol sort operation, and
+ *  if found, will set (RELOC_AUTO|KASLR).  On live systems, the search
+ *  is done here by checking /proc/kallsyms.
  */
 static void
 kaslr_init(void)
@@ -646,7 +646,8 @@ kaslr_init(void)
                st->_stext_vmlinux = UNINITIALIZED;
 
        if (ACTIVE() &&   /* Linux 3.15 */
-           (symbol_value_from_proc_kallsyms("module_load_offset") != BADVAL)) {
+           ((symbol_value_from_proc_kallsyms("kaslr_regions") != BADVAL) ||
+           (symbol_value_from_proc_kallsyms("module_load_offset") != BADVAL))) 
{
                kt->flags2 |= (RELOC_AUTO|KASLR);
                st->_stext_vmlinux = UNINITIALIZED;
        }
@@ -14247,7 +14248,9 @@ numeric_forward(const void *P_x, const void *P_y)
                        st->_stext_vmlinux = valueof(y);
        }
        if (kt->flags2 & KASLR_CHECK) {
-               if (STREQ(x->name, "module_load_offset") || 
+               if (STREQ(x->name, "kaslr_regions") ||
+                   STREQ(y->name, "kaslr_regions") ||
+                   STREQ(x->name, "module_load_offset") ||
                    STREQ(y->name, "module_load_offset")) {
                        kt->flags2 &= ~KASLR_CHECK;
                        kt->flags2 |= (RELOC_AUTO|KASLR);
-- 
2.45.1
--
Crash-utility mailing list -- devel@lists.crash-utility.osci.io
To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to