Re: [RFC PATCH 13/15] Fix get_section, check_for_dups, symbol_query, symbol_name_count

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 11, 2023 at 12:35 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab@xxxxxxx> wrote:
Signed-off-by: Kazuhito Hagio <k-hagio-ab@xxxxxxx>
---
 symbols.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 99 insertions(+), 6 deletions(-)

diff --git a/symbols.c b/symbols.c
index 9714453400bf..db22f3c4e8b3 100644
--- a/symbols.c
+++ b/symbols.c
@@ -1526,8 +1526,13 @@ check_for_dups(struct load_module *lm)
 {
        struct syment *sp, *sp_end;

-        sp = lm->mod_symtable;
-        sp_end = lm->mod_symend;
+       if (MODULE_MEMORY()) {
+               sp = lm->mod_load_symtable;
+               sp_end = lm->mod_load_symend;
+       } else {
+               sp = lm->mod_symtable;
+               sp_end = lm->mod_symend;
+       }

         for ( ; sp <= sp_end; sp++) {
                 if (symbol_name_count(sp->name) > 1)
@@ -5033,8 +5038,11 @@ get_section(ulong vaddr, char *buf)
        if (module_symbol(vaddr, NULL, &lm, NULL, *gdb_output_radix)) {
                if (lm->mod_flags & MOD_LOAD_SYMS) {
                        for (i = (lm->mod_sections-1); i >= 0; i--) {
-                                start = lm->mod_base +
-                                        lm->mod_section_data[i].offset;
+                               if (MODULE_MEMORY())
+                                       start = lm->mod_section_data[i].addr;
+                               else
+                                       start = lm->mod_base +
+                                               lm->mod_section_data[i].offset;
                                 end = start + lm->mod_section_data[i].size;

                                 if ((vaddr >= start) && (vaddr < end)) {
@@ -5089,7 +5097,7 @@ get_build_directory(char *buf)
 int
 symbol_query(char *s, char *print_pad, struct syment **spp)
 {
-       int i;
+       int i, j;
         struct syment *sp, *sp_end;
        struct load_module *lm;
        int cnt, search_init;
@@ -5109,6 +5117,60 @@ symbol_query(char *s, char *print_pad, struct syment **spp)
                }
        }

+       if (!MODULE_MEMORY())
+               goto old_module;
+
+       for (i = 0; i < st->mods_installed; i++) {
+               lm = &st->load_modules[i];
+
+               if (lm->mod_flags & MOD_LOAD_SYMS) {
+                       sp = lm->mod_load_symtable;
+                       sp_end = lm->mod_load_symend;
+
+                       for (; sp < sp_end; sp++) {
+                               if (MODULE_PSEUDO_SYMBOL(sp))
+                                       continue;

This means that it will also skip searching for any *_INIT_* , is it expected behavior?

Other changes in this patch are fine to me.

Thanks.
Lianbo
 
+
+                               if (strstr(sp->name, s)) {
+                                       if (print_pad) {
+                                               if (strlen(print_pad))
+                                                       fprintf(fp, "%s", print_pad);
+                                               show_symbol(sp, 0, SHOW_RADIX()|SHOW_MODULE);
+                                       }
+                                       if (spp)
+                                               *spp = sp;
+                                       cnt++;
+                               }
+                       }
+               } else {
+                       for (j = MOD_TEXT; j < MOD_MEM_NUM_TYPES; j++) {
+                               if (!lm->symtable[j])
+                                       continue;
+
+                               sp = lm->symtable[j];
+                               sp_end = lm->symend[j];
+
+                               for (; sp < sp_end; sp++) {
+                                       if (MODULE_PSEUDO_SYMBOL(sp))
+                                               continue;
+
+                                       if (strstr(sp->name, s)) {
+                                               if (print_pad) {
+                                                       if (strlen(print_pad))
+                                                               fprintf(fp, "%s", print_pad);
+                                                       show_symbol(sp, 0, SHOW_RADIX()|SHOW_MODULE);
+                                               }
+                                               if (spp)
+                                                       *spp = sp;
+                                               cnt++;
+                                       }
+                               }
+                       }
+               }
+       }
+       return cnt;
+
+old_module:
        search_init = FALSE;

        for (i = 0; i < st->mods_installed; i++) {
@@ -5214,7 +5276,7 @@ symbol_search(char *s)
 int
 symbol_name_count(char *s)
 {
-        int i;
+        int i, j;
         struct syment *sp, *sp_end;
         struct load_module *lm;
         int count, pseudos, search_init;
@@ -5228,6 +5290,37 @@ symbol_name_count(char *s)
                }
         }

+       if (!MODULE_MEMORY())
+               goto old_module;
+
+        for (i = 0; i < st->mods_installed; i++) {
+                lm = &st->load_modules[i];
+
+               if (lm->mod_flags & MOD_LOAD_SYMS) {
+                       sp = lm->mod_load_symtable;
+                       sp_end = lm->mod_load_symend;
+
+                       for (; sp < sp_end; sp++) {
+                               if (STREQ(s, sp->name))
+                                       count++;
+                       }
+               } else {
+                       for (j = MOD_TEXT; j < MOD_MEM_NUM_TYPES; j++) {
+                               if (!lm->symtable[j])
+                                       continue;
+
+                               sp = lm->symtable[j];
+                               sp_end = lm->symend[j];
+                               for (; sp < sp_end; sp++) {
+                                       if (STREQ(s, sp->name))
+                                               count++;
+                               }
+                       }
+               }
+       }
+       return count++;
+
+old_module:
         pseudos = (strstr(s, "_MODULE_START_") || strstr(s, "_MODULE_END_"));
        search_init = FALSE;

--
2.31.1

--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux