Hello Dave, I add helper pseudo symbol about found out module sections. They can be looked see by "sym -m <module name>" after module object file has been loaded. I think the visual effects of section layout or grouping are useful information for symbols. Thanks, Toshi --- crash> mod -s blowfish crash> sym -m blowfish ffffffffa0134000 MODULE START: blowfish ffffffffa0134000 [.text]: section start ffffffffa0134000 (t) encrypt_block ffffffffa0134434 (t) bf_encrypt ffffffffa0134470 (t) bf_decrypt ffffffffa01348ae (t) bf_setkey ffffffffa0134a10 [.text]: section end ffffffffa0134a10 [.exit.text]: section start ffffffffa0134a10 (T) cleanup_module ffffffffa0134a10 (t) fini ffffffffa0134a25 [.exit.text]: section end ffffffffa0134a40 [.rodata]: section start ffffffffa0134a40 (r) bf_pbox ffffffffa0134aa0 (r) bf_sbox ffffffffa0135aa0 [.rodata]: section end ffffffffa01361a0 [.data]: section start ffffffffa01361a0 (d) alg ffffffffa0136230 [.data]: section end ffffffffa0136280 [.gnu.linkonce.this_module]: section start ffffffffa0136280 (D) __this_module ffffffffa0136800 [.gnu.linkonce.this_module]: section end ffffffffa0136800 MODULE END: blowfish crash>
Date: Tue, 6 Dec 2011 10:41:06 +0900 Subject: [PATCH 1/2] section pseudo symbol for module Add new helper pseudo symbol about found out sections to module symbol table when module object file has been loaded. Rolling up symbols as particular section group or cheking module section layouts in memory visually make "sym -m <mod>" better. Signed-off-by: Toshikazu Nakayama <nakayama.ts@xxxxxxxxxxxxxx> --- symbols.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 96 insertions(+), 2 deletions(-) diff --git a/symbols.c b/symbols.c index 0cd3a01..30a142d 100755 --- a/symbols.c +++ b/symbols.c @@ -901,12 +901,15 @@ symname_hash_search(char *name) #define MODULE_PSEUDO_SYMBOL(sp) \ ((STRNEQ((sp)->name, "_MODULE_START_") || STRNEQ((sp)->name, "_MODULE_END_")) || \ - (STRNEQ((sp)->name, "_MODULE_INIT_START_") || STRNEQ((sp)->name, "_MODULE_INIT_END_"))) + (STRNEQ((sp)->name, "_MODULE_INIT_START_") || STRNEQ((sp)->name, "_MODULE_INIT_END_")) || \ + (STRNEQ((sp)->name, "_MODULE_SECTION_"))) #define MODULE_START(sp) (STRNEQ((sp)->name, "_MODULE_START_")) #define MODULE_END(sp) (STRNEQ((sp)->name, "_MODULE_END_")) #define MODULE_INIT_START(sp) (STRNEQ((sp)->name, "_MODULE_INIT_START_")) #define MODULE_INIT_END(sp) (STRNEQ((sp)->name, "_MODULE_INIT_END_")) +#define MODULE_SECTION_START(sp) (STRNEQ((sp)->name, "_MODULE_SECTION_START")) +#define MODULE_SECTION_END(sp) (STRNEQ((sp)->name, "_MODULE_SECTION_END")) static void symbol_dump(ulong flags, char *module) @@ -957,7 +960,15 @@ symbol_dump(ulong flags, char *module) } if (MODULE_PSEUDO_SYMBOL(sp)) { - if (MODULE_START(sp)) { + if (MODULE_SECTION_START(sp)) { + p1 = sp->name + + strlen("_MODULE_SECTION_START "); + p2 = "section start"; + } else if (MODULE_SECTION_END(sp)) { + p1 = sp->name + + strlen("_MODULE_SECTION_END "); + p2 = "section end"; + } else if (MODULE_START(sp)) { p1 = "MODULE START"; p2 = sp->name+strlen("_MODULE_START_"); start = TRUE; @@ -2337,6 +2348,7 @@ static int compare_syms(const void *v1, const void *v2) { struct syment *s1, *s2; + char sn1[BUFSIZE], sn2[BUFSIZE]; s1 = (struct syment *)v1; s2 = (struct syment *)v2; @@ -2348,6 +2360,55 @@ compare_syms(const void *v1, const void *v2) return 1; if (STRNEQ(s2->name, "_MODULE_START_")) return 1; + /* Get pseudo section name. */ + if (MODULE_SECTION_START(s1)) + sscanf(s1->name, "_MODULE_SECTION_START [%s]", sn1); + else if (MODULE_SECTION_END(s1)) + sscanf(s1->name, "_MODULE_SECTION_END [%s]", sn1); + + if (MODULE_SECTION_START(s2)) + sscanf(s2->name, "_MODULE_SECTION_START [%s]", sn2); + else if (MODULE_SECTION_END(s2)) + sscanf(s2->name, "_MODULE_SECTION_END [%s]", sn2); + + /* + * Sort pseudo symbols in mind section. + * The same values must be sorted like examples. + * - exp1 + * c9046000 MODULE START: sctp + * c9046000 [.data]: section start + * c9046000 (D) sctp_timer_events + * + * - exp2 + * c9046c68 [.bss]: section end + * c9046c68 MODULE END: sctp + * + * - exp3 + * c90e9b44 [.text]: section end + * c90e9b44 [.exit.text]: section start + * c90e9b44 (T) cleanup_module + * c90e9b44 (t) sctp_exit + * c90e9c81 [.exit.text]: section end + */ + if (MODULE_SECTION_END(s1)) { + if (!MODULE_PSEUDO_SYMBOL(s2) || MODULE_END(s2)) + return -1; + else if (MODULE_SECTION_START(s2) && !STREQ(sn1, sn2)) + return -1; + return 1; + } + if (MODULE_SECTION_END(s2)) { + if (MODULE_END(s1) || !MODULE_PSEUDO_SYMBOL(s1)) + return 1; + else if (MODULE_SECTION_START(s1) && STREQ(sn1, sn2)) + return 1; + return -1; + } + if (MODULE_SECTION_START(s2)) { + if (MODULE_START(s1)) + return -1; + return 1; + } } return (s1->value < s2->value ? -1 : @@ -10178,6 +10239,39 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms, } } + /* + * Append helpful pseudo symbols about found out sections. + * Use 'S' as its type which is never seen in existing symbols. + */ + for (i = 0; i < lm->mod_sections; i++) { + if (!(lm->mod_section_data[i].flags & SEC_FOUND)) + continue; + /* Section start */ + lm->mod_load_symend->value = lm->mod_base + + lm->mod_section_data[i].offset; + lm->mod_load_symend->type = 'S'; + lm->mod_load_symend->flags |= MODULE_SYMBOL; + sprintf(name, "_MODULE_SECTION_START [%s]", + lm->mod_section_data[i].name); + namespace_ctl(NAMESPACE_INSTALL, &lm->mod_load_namespace, + lm->mod_load_symend, name); + lm->mod_load_symend++; + lm->mod_load_symcnt++; + + /* Section end */ + lm->mod_load_symend->value = lm->mod_base + + lm->mod_section_data[i].offset + + lm->mod_section_data[i].size; + lm->mod_load_symend->type = 'S'; + lm->mod_load_symend->flags |= MODULE_SYMBOL; + sprintf(name, "_MODULE_SECTION_END [%s]", + lm->mod_section_data[i].name); + namespace_ctl(NAMESPACE_INSTALL, &lm->mod_load_namespace, + lm->mod_load_symend, name); + lm->mod_load_symend++; + lm->mod_load_symcnt++; + } + namespace_ctl(NAMESPACE_COMPLETE, &lm->mod_load_namespace, lm->mod_load_symtable, lm->mod_load_symend); -- 1.7.7.rc0.72.g4b5ea
Date: Tue, 6 Dec 2011 11:03:55 +0900 Subject: [PATCH 2/2] add pseudo section symbol skip to value_search_module() Ignore pseudo section symbols while next sp is MODULE_PSEUDO_SYMBOL(). crash> mod -s e1000 crash> sym -m e1000 | head -n 5 ffffffffa0029000 MODULE START: e1000 ffffffffa0029000 [.text]: section start ffffffffa0029000 (t) e1000_request_irq ffffffffa00290bc (t) e1000_free_irq ffffffffa00290ee (t) e1000_irq_disable [Prev] crash> sym ffffffffa0029000 ffffffffa0029000 (S) _MODULE_SECTION_START [.text] [e1000] <my mod path> -> The result could not skip pseudo section symbol. [Now] crash> sym ffffffffa0029000 ffffffffa0029000 (t) e1000_request_irq [e1000] <my mod path> -> The result could skip all pseudo symbol(s). Signed-off-by: Toshikazu Nakayama <nakayama.ts@xxxxxxxxxxxxxx> --- symbols.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/symbols.c b/symbols.c index 30a142d..6a9040b 100755 --- a/symbols.c +++ b/symbols.c @@ -4142,8 +4142,10 @@ retry: if (MODULE_END(sp) || MODULE_INIT_END(sp)) break; - if (MODULE_START(sp) || MODULE_INIT_START(sp)) { - spnext = sp+1; + if (MODULE_PSEUDO_SYMBOL(sp)) { + spnext = sp + 1; + if (MODULE_PSEUDO_SYMBOL(spnext)) + continue; if (spnext->value == value) sp = spnext; } -- 1.7.7.rc0.72.g4b5ea
-- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility