On 2024/03/01 12:21, [email protected] wrote:
> 
> The log was not cut off last time. This is the entire log.
> it seems ".text" exit in the list.

Hmm, it looks no ".text" section to me..  a ".text" section exists like 
this in a vmcore on hand:

crash> mod -s xfs
ffffffffc07a3000 .note.gnu.build-id
ffffffffc07a3024 .note.Linux
ffffffffc0578000 .text               << this one
ffffffffc067bb44 .static_call.text
ffffffffc054a000 .init.text
...

It looks like each function has its own section in your vmcore.  I found 
-ffunction-sections option of gcc, do you use this?  probably the 
current crash does not support this gcc option.

Just an experiment, how does the attached patch work?

Thanks,
Kazu


> crash_latest_fix_k66> mod -d sysdump
> crash_latest_fix_k66> set debug 1
> debug: 1
> crash_latest_fix_k66> mod -s sysdump
> ffffffc07afb8000 __ksymtab
> ffffffc07afb8060 __kcrctab
> ffffffc07afb8080 .altinstructions
> ffffffc07afa8000 __bug_table
> ffffffc07afbc000 __jump_table
> ffffffc07afa8010 .bss
> ffffffc07afa84b8 .data
> ffffffc07afb8248 .rodata
> ffffffc07afa0000 .plt
> ffffffc07afbe000 .init.plt
> ffffffc07afa0a8c .text.ftrace_trampoline
> ffffffc07afc9000 .init.eh_frame
> ffffffc07afba370 .export_symbol
> ffffffc07afa0a98 .text.sysdump_callback_register
> ffffffc07afa0aa8 .text.sysdump_callback_unregiste
> ffffffc07afa0ab8 .text.sprd_debug_check_crash_key
> ffffffc07afa0c04 .text.sprd_vmalloc_or_module_add
> ffffffc07afa0c40 .text.unisoc_virt_to_phys
> ffffffc07afa0d0c .text.minidump_save_extend_infor
> ffffffc07afa1080 .text.minidump_change_extend_inf
> ffffffc07afa11bc .text.crash_note_save_cpu
> ffffffc07afa1494 .text.sysdump_ipi
> ffffffc07afa17cc .text.prepare_minidump_reg_memor
> ffffffc07afa1aec .text.show_minidump_info
> ffffffc07afa21d0 .text.minidump_init
> ffffffc07afa25dc .text.show_exception_info
> ffffffc07afa27dc .text.get_file_line_info
> ffffffc07afa2830 .text.get_exception_stack_info
> ffffffc07afa2af4 .text.prepare_dump_info_for_wdh
> ffffffc07afa2b30 .text.prepare_minidump_info
> ffffffc07afa2bd8 .text.prepare_exception_info
> ffffffc07afa2da0 .text.sysdump_sysctl_exit
> ffffffc07afa2f50 .text.init_module
> ffffffc07afa3f30 .text.rcu_lock_acquire
> ffffffc07afa3f70 .text.rcu_lock_release
> ffffffc07afa3f9c .text.minidump_info_open
> ffffffc07afa3fcc .text.minidump_info_read
> ffffffc07afa4020 .text.ylog_buffer_map
> ffffffc07afa40a8 .text.ylog_buffer_open
> ffffffc07afa40b4 .text.dump_die_cb
> ffffffc07afa4118 .text.sysdump_event
> ffffffc07afa4150 .text.sysdump_connect
> ffffffc07afa420c .text.sysdump_disconnect
> ffffffc07afa4240 .text.sysdump_panic_event
> ffffffc07afa4980 .text.per_cpu_funcs_register
> ffffffc07afa49fc .text.sprd_sysdump_open
> ffffffc07afa4a2c .text.sprd_sysdump_write
> ffffffc07afa4ce8 .text.sprd_sysdump_read
> ffffffc07afb01d0 __dyndbg
> ffffffc07afc0000 .init.data
> ffffffc07afb0ba8 .exit.data
> ffffffc07afa4d24 .text.append_elf_note
> ffffffc07afa4dbc .text.final_note
> ffffffc07afa4dcc .text.update_vmcoreinfo_note
> ffffffc07afa4e24 .text.crash_update_vmcoreinfo_sa
> ffffffc07afa4e70 .text.crash_save_vmcoreinfo
> ffffffc07afa4ef8 .text.vmcoreinfo_append_str
> ffffffc07afa5008 .text.paddr_vmcoreinfo_note
> ffffffc07afa5048 .text.crash_save_vmcoreinfo_init
> ffffffc07afa5594 .text.crash_save_vmcoreinfo_exit
> ffffffc07afa55e0 .text.sysdump_get_kmsg_to_buffer
> ffffffc07afa5680 .text.last_kmsg_init
> ffffffc07afa5b90 .text.last_kmsg_exit
> ffffffc07afa5ca0 .text.kmsg_get_thread
> ffffffc07afa5db0 .text.save_log_to_partition_hand
> ffffffc07afa6040 .text.get_last_kmsg
> ffffffc07afa6120 .text.last_kmsg_handler
> ffffffc07afba3f0 __ksymtab_strings
> ffffffc07afba4c4 .note.Linux
> ffffffc07afb0bc0 .gnu.linkonce.this_module
> ffffffc07afba4f4 .note.gnu.build-id
> ffffffc07afba518 .note.gnu.property
> ffffffc07afc0008 .symtab
> ffffffc07afc4928 .strtab
> /home/tianming.wang/workdir/kernel_6.6/sysdump.ko: add_symbol_file_kallsyms 
> failed
> add-symbol-file /home/tianming.wang/workdir/kernel_6.6/sysdump.ko 
> 0xffffffc07afa0000  -s .data 0xffffffc07afa84b8 -s .bss 0xffffffc07afa8010 -s 
> .rodata 0xffffffc07afb8248
> add symbol table from file 
> "/home/tianming.wang/workdir/kernel_6.6/sysdump.ko" at
>          .text_addr = 0xffffffc07afa0000
>          .data_addr = 0xffffffc07afa84b8
>          .bss_addr = 0xffffffc07afa8010
>          .rodata_addr = 0xffffffc07afb8248
>       MODULE       NAME                           TEXT_BASE         SIZE  
> OBJECT FILE
> ffffffc07afb0bc0  sysdump                     ffffffc07afa0000   106496  
> /home/tianming.wang/workdir/kernel_6.6/sysdump.ko
> --
> Crash-utility mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
> https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
> Contribution Guidelines: https://github.com/crash-utility/crash/wiki
diff --git a/defs.h b/defs.h
index 98650e8..9f40045 100644
--- a/defs.h
+++ b/defs.h
@@ -2240,6 +2240,9 @@ struct offset_table {                    /* stash of 
commonly-used offsets */
        long mnt_namespace_nr_mounts;
        long mount_mnt_node;
        long log_caller_id;
+       long module_sect_attr_battr;
+       long bin_attribute_attr;
+       long attribute_name;
 };
 
 struct size_table {         /* stash of commonly-used sizes */
@@ -2911,8 +2914,9 @@ struct symbol_table_data {
 #define MODSECT_V1      (0x2000)
 #define MODSECT_V2      (0x4000)
 #define MODSECT_V3      (0x8000)
-#define MODSECT_VMASK   (MODSECT_V1|MODSECT_V2|MODSECT_V3)
 #define NO_STRIP       (0x10000)
+#define MODSECT_V4     (0x20000)
+#define MODSECT_VMASK  (MODSECT_V1|MODSECT_V2|MODSECT_V3|MODSECT_V4)
 
 #define NO_LINE_NUMBERS() ((st->flags & GDB_SYMS_PATCHED) && !(kt->flags2 & 
KASLR))
 
diff --git a/symbols.c b/symbols.c
index cbc9ed1..19f7dd0 100644
--- a/symbols.c
+++ b/symbols.c
@@ -3812,6 +3812,8 @@ dump_symbol_table(void)
                 fprintf(fp, "%sMODSECT_V2", others++ ? "|" : "");
         if (st->flags & MODSECT_V3)
                 fprintf(fp, "%sMODSECT_V3", others++ ? "|" : "");
+        if (st->flags & MODSECT_V4)
+                fprintf(fp, "%sMODSECT_V4", others++ ? "|" : "");
         if (st->flags & MODSECT_UNKNOWN)
                 fprintf(fp, "%sMODSECT_UNKNOWN", others++ ? "|" : "");
         if (st->flags & NO_STRIP)
@@ -10233,6 +10235,7 @@ dump_offset_table(char *spec, ulong makestruct)
                OFFSET(module_sect_attrs_attrs));
        fprintf(fp, "   module_sect_attrs_nsections: %ld\n",
                OFFSET(module_sect_attrs_nsections));
+       fprintf(fp, "        module_sect_attr_battr: %ld\n", 
OFFSET(module_sect_attr_battr));
        fprintf(fp, "        module_sect_attr_mattr: %ld\n",
                OFFSET(module_sect_attr_mattr));
        fprintf(fp, "         module_sect_attr_name: %ld\n",
@@ -10241,12 +10244,14 @@ dump_offset_table(char *spec, ulong makestruct)
                OFFSET(module_sect_attr_address));
        fprintf(fp, "               attribute_owner: %ld\n",
                OFFSET(attribute_owner));
+       fprintf(fp, "                attribute_name: %ld\n", 
OFFSET(attribute_name));
        fprintf(fp, "         module_sect_attr_attr: %ld\n",
                OFFSET(module_sect_attr_attr));
        fprintf(fp, "         module_sections_attrs: %ld\n",
                OFFSET(module_sections_attrs));
        fprintf(fp, "         module_attribute_attr: %ld\n",
                OFFSET(module_attribute_attr));
+       fprintf(fp, "            bin_attribute_attr: %ld\n", 
OFFSET(bin_attribute_attr));
 
         fprintf(fp, "         module_kallsyms_start: %ld\n",
                OFFSET(module_kallsyms_start));
@@ -13165,7 +13170,14 @@ add_symbol_file_kallsyms(struct load_module *lm, 
struct gnu_request *req)
                MEMBER_OFFSET_INIT(attribute_owner,
                        "attribute", "owner");
 
-               if (VALID_MEMBER(module_sect_attrs_attrs) &&
+               /* Linux 5.8 and later */
+               MEMBER_OFFSET_INIT(module_sect_attr_battr, "module_sect_attr", 
"battr");
+               MEMBER_OFFSET_INIT(bin_attribute_attr, "bin_attribute", "attr");
+               MEMBER_OFFSET_INIT(attribute_name, "attribute", "name");
+
+               if (VALID_MEMBER(module_sect_attr_battr))
+                       st->flags |= MODSECT_V4;
+               else if (VALID_MEMBER(module_sect_attrs_attrs) &&
                    VALID_MEMBER(module_sect_attr_mattr) &&
                    VALID_MEMBER(module_attribute_attr) &&
                    VALID_MEMBER(module_sect_attrs_nsections))
@@ -13185,7 +13197,7 @@ add_symbol_file_kallsyms(struct load_module *lm, struct 
gnu_request *req)
                    (INVALID_MEMBER(attribute_owner) && 
                     (st->flags & (MODSECT_V1|MODSECT_V2))) ||
                    INVALID_MEMBER(module_sect_attrs) ||
-                   INVALID_MEMBER(module_sect_attr_name) ||
+                   (INVALID_MEMBER(module_sect_attr_name) && !(st->flags & 
MODSECT_V4)) ||
                    INVALID_MEMBER(module_sect_attr_address)) {
                        if (CRASHDEBUG(1)) 
                                error(WARNING, 
@@ -13216,6 +13228,7 @@ add_symbol_file_kallsyms(struct load_module *lm, struct 
gnu_request *req)
                nsections = UNUSED;
                break;
        case MODSECT_V3:
+       case MODSECT_V4:
                array_entry = vaddr + OFFSET(module_sect_attrs_attrs);
                if (!readmem(vaddr + OFFSET(module_sect_attrs_nsections),
                    KVADDR, &nsections, sizeof(int), 
@@ -13229,7 +13242,10 @@ add_symbol_file_kallsyms(struct load_module *lm, 
struct gnu_request *req)
        if (CRASHDEBUG(2))
                fprintf(fp, "%s:\n", lm->mod_namelist);
 
-       name_type = MEMBER_TYPE("module_sect_attr", "name");
+       name_type = TYPE_CODE_UNDEF;
+       if (!(st->flags & MODSECT_V4))
+               name_type = MEMBER_TYPE("module_sect_attr", "name");
+
        req->buf = GETBUF(buflen = 1024);
        retval = FALSE;
 
@@ -13245,6 +13261,10 @@ add_symbol_file_kallsyms(struct load_module *lm, 
struct gnu_request *req)
                        attribute = array_entry + 
OFFSET(module_sect_attr_mattr) 
                                + OFFSET(module_attribute_attr);
                        break;
+               case MODSECT_V4:
+                       attribute = array_entry + OFFSET(module_sect_attr_battr)
+                               + OFFSET(bin_attribute_attr);
+                       break;
                }
        
                if (st->flags & (MODSECT_V1|MODSECT_V2))
@@ -13253,23 +13273,35 @@ add_symbol_file_kallsyms(struct load_module *lm, 
struct gnu_request *req)
                        owner = UNUSED;
 
                address = array_entry + OFFSET(module_sect_attr_address);
-               switch (name_type)
-               {
-               case TYPE_CODE_ARRAY:
-                       name = array_entry + OFFSET(module_sect_attr_name);
-                       break;
-               case TYPE_CODE_PTR:
-                       if (!readmem(array_entry + 
OFFSET(module_sect_attr_name),
-                           KVADDR, &name, sizeof(void *), 
-                           "module_sect_attr.name", RETURN_ON_ERROR|QUIET)) {
+
+               if (st->flags & MODSECT_V4) {
+                       if (!readmem(array_entry + 
OFFSET(module_sect_attr_battr)
+                           + OFFSET(bin_attribute_attr) + 
OFFSET(attribute_name),
+                           KVADDR, &name, sizeof(void *),
+                           "module_sect_attr.battr.attr.name", 
RETURN_ON_ERROR|QUIET)) {
                                done = TRUE;
                                retval = FALSE;
                                continue;
                        }
-                       break;
-               default:
-                       done = TRUE;
-                       retval = FALSE;
+               } else {
+                       switch (name_type)
+                       {
+                       case TYPE_CODE_ARRAY:
+                               name = array_entry + 
OFFSET(module_sect_attr_name);
+                               break;
+                       case TYPE_CODE_PTR:
+                               if (!readmem(array_entry + 
OFFSET(module_sect_attr_name),
+                                   KVADDR, &name, sizeof(void *),
+                                   "module_sect_attr.name", 
RETURN_ON_ERROR|QUIET)) {
+                                       done = TRUE;
+                                       retval = FALSE;
+                                       continue;
+                               }
+                               break;
+                       default:
+                               done = TRUE;
+                               retval = FALSE;
+                       }
                }
 
                if (CRASHDEBUG(2)) {
@@ -13341,12 +13373,24 @@ add_symbol_file_kallsyms(struct load_module *lm, 
struct gnu_request *req)
        }
 
        if (retval == FALSE) {
+               sprintf(buf, "add-symbol-file %s 0x%lx %s",
+                       lm->mod_namelist, lm->mod_text_start,
+                       pc->curcmd_flags & MOD_READNOW ? "-readnow" : "");
+               len = strlen(req->buf);
+               while ((len + strlen(buf)) >= buflen) {
+                       RESIZEBUF(req->buf, buflen, buflen * 2);
+                       buflen *= 2;
+               }
+               shift_string_right(req->buf, strlen(buf));
+               BCOPY(buf, req->buf, strlen(buf));
+               /*
                if (CRASHDEBUG(1))
                        fprintf(fp, "%s: add_symbol_file_kallsyms failed\n", 
                                lm->mod_namelist);
                FREEBUF(req->buf);
                req->buf = NULL;
                return FALSE;
+               */
        }
 
        /* 
--
Crash-utility mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to