Hi Lianbo,
On Wed, Apr 3, 2024 at 5:48 PM lijiang <lijiang(a)redhat.com> wrote:
Hi, Tao
Thanks for the comments.
On Wed, Apr 3, 2024 at 11:45 AM Tao Liu <ltao(a)redhat.com> wrote:
>
> Hi Lianbo,
>
> On Wed, Mar 6, 2024 at 2:32 PM Lianbo Jiang <lijiang(a)redhat.com> wrote:
> >
> > Some objects format may potentially support copy relocations, but
> > currently the maybe_copied is always initialized to 0 in the symbol().
> > And the type is 'mst_file_bss', not always the 'mst_bss' or
'mst_data'
> > in the lookup_minimal_symbol_linkage(). For example:
> >
> > (gdb) p *msymbol
> > $42 = {<general_symbol_info> = {m_name = 0x349812f
"test_no_static", value = {ivalue = 8, block = 0x8,
> > bytes = 0x8 <error: Cannot access memory at address 0x8>, address =
8, common_block = 0x8, chain = 0x8}, language_specific = {
> > obstack = 0x0, demangled_name = 0x0}, m_language = language_auto,
ada_mangled = 0, section = 20}, size = 4,
> > filename = 0x6db3440 "test_sanity.c", type = mst_file_bss,
created_by_gdb = 0, target_flag_1 = 0, target_flag_2 = 0, has_size = 1,
> > maybe_copied = 0, name_set = 1, hash_next = 0x0, demangled_hash_next = 0x0}
> >
> The whole bug is around test_no_static, which is a static variable in
> the ko. However the added code to lookup_minimal_symbol_linkage() is
> mst_file_bss/mst_file_data. So I guess test_no_static's symbol type
Just to be safe I added the type 'mst_file_data' check, because there might be a
similar situation, but I can not prove it for the time being. Do you have any specific
concerns about it?
Sorry, I re-read the output of "p *msymbol". The symbol you are
printing is "test_no_static", and it belongs to file "test_sanity.c",
and its type is "mst_file_bss", which makes sense. I thought you were
printing some symbol else instead of "test_no_static". Sorry about
that.
Thanks,
Tao Liu
> should be one of the 2 right? If that is the case, I suggest printing
> "test_no_static" instead of "test_sanity.c" for "p
*msymbol", so it
> can be clearer for the adding of mst_file_bss/mst_file_data.
> Personally I think the symbol "test_sanity.c" doesn't make sense here.
>
The "test_sanity.c" is a module name, and the "test_no_static" is a
static variable in this module.
I just printed the debug info to help understand the current issue. In fact, the current
issue happened in the productive environment, and the test module
"test_sanity.c" is only used to help reproduce this issue.
Hope this helps.
Thanks
Lianbo
> Thanks,
> Tao Liu
>
> > This causes a problem that the 'p' command can not work well as
> > expected, and always gets an error:
> >
> > crash> mod -s test_sanity /home/test_sanity.ko
> > MODULE NAME BASE SIZE OBJECT
FILE
> > ffffffffc1084040 test_sanity ffffffffc1082000 16384
/home/test_sanity.ko
> > crash> p test_no_static
> > p: gdb request failed: p test_no_static
> > crash>
> >
> > With the patch:
> > crash> mod -s test_sanity /home/test_sanity.ko
> > MODULE NAME BASE SIZE OBJECT
FILE
> > ffffffffc1084040 test_sanity ffffffffc1082000 16384
/home/test_sanity.ko
> > crash> p test_no_static
> > test_no_static = $1 = 5
> > crash>
> >
> > Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
> > ---
> > Here is the test case:
> > #include <linux/kernel.h>
> > #include <linux/module.h>
> >
> > int test_no = 0;
> > static int test_no_static = 0;
> >
> > static int test_init(void)
> > {
> > test_no += 5;
> > test_no_static += 5;
> > printk(KERN_INFO "%d static=%d\n", test_no, test_no_static);
> > return 0;
> > }
> > static void test_exit(void)
> >
> > {
> > test_no += 7;
> > test_no_static += 7;
> > printk(KERN_INFO "%d static=%d\n", test_no, test_no_static);
> > }
> > module_init(test_init);
> > module_exit(test_exit);
> > MODULE_LICENSE("GPL");
> >
> >
> > gdb-10.2.patch | 24 ++++++++++++++++++++++++
> > 1 file changed, 24 insertions(+)
> >
> > diff --git a/gdb-10.2.patch b/gdb-10.2.patch
> > index a7018a249118..35388ba03e25 100644
> > --- a/gdb-10.2.patch
> > +++ b/gdb-10.2.patch
> > @@ -16057,3 +16057,27 @@ exit 0
> > m10200-dis.c
> > m10200-opc.c
> > m10300-dis.c
> > +--- gdb-10.2/gdb/minsyms.c.orig
> > ++++ gdb-10.2/gdb/minsyms.c
> > +@@ -535,7 +535,9 @@ lookup_minimal_symbol_linkage (const char *name, struct
objfile *objf)
> > + {
> > + if (strcmp (msymbol->linkage_name (), name) == 0
> > + && (MSYMBOL_TYPE (msymbol) == mst_data
> > +- || MSYMBOL_TYPE (msymbol) == mst_bss))
> > ++ || MSYMBOL_TYPE (msymbol) == mst_bss
> > ++ || MSYMBOL_TYPE (msymbol) == mst_file_bss
> > ++ || MSYMBOL_TYPE (msymbol) == mst_file_data))
> > + return {msymbol, objfile};
> > + }
> > + }
> > +--- gdb-10.2/gdb/symtab.h.orig
> > ++++ gdb-10.2/gdb/symtab.h
> > +@@ -1110,7 +1110,7 @@ struct symbol : public general_symbol_info, public
allocate_on_obstack
> > + is_objfile_owned (1),
> > + is_argument (0),
> > + is_inlined (0),
> > +- maybe_copied (0),
> > ++ maybe_copied (1),/* The objfile potentially supports copy relocations.
*/
> > + subclass (SYMBOL_NONE)
> > + {
> > + /* We can't use an initializer list for members of a base class,
and
> > --
> > 2.41.0
> > --
> > Crash-utility mailing list -- devel(a)lists.crash-utility.osci.io
> > To unsubscribe send an email to devel-leave(a)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
>