Skip to content

Commit eedf12d

Browse files
lian-bok-hagio
authored andcommitted
gdb: fix "p" command to print module variables correctly
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} This causes a problem that the 'p' command cannot work well as expected, and emits an error or a bogus value: 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> The issue occurs with Linux 6.2 and later or kernels that have kernel commit 80e4c1cd42ff ("x86/retbleed: Add X86_FEATURE_CALL_DEPTH") and configured with CONFIG_CALL_DEPTH_TRACKING=y, including RHEL9.3 and later kernels. 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 <[email protected]>
1 parent 7d4daf0 commit eedf12d

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

gdb-10.2.patch

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16094,3 +16094,27 @@ exit 0
1609416094
+{
1609516095
+ loongarch_elf_fpregset.collect_regset (NULL, regcache, regno, fpregset, sizeof (prfpregset_t));
1609616096
+}
16097+
--- gdb-10.2/gdb/minsyms.c.orig
16098+
+++ gdb-10.2/gdb/minsyms.c
16099+
@@ -535,7 +535,9 @@ lookup_minimal_symbol_linkage (const char *name, struct objfile *objf)
16100+
{
16101+
if (strcmp (msymbol->linkage_name (), name) == 0
16102+
&& (MSYMBOL_TYPE (msymbol) == mst_data
16103+
- || MSYMBOL_TYPE (msymbol) == mst_bss))
16104+
+ || MSYMBOL_TYPE (msymbol) == mst_bss
16105+
+ || MSYMBOL_TYPE (msymbol) == mst_file_bss
16106+
+ || MSYMBOL_TYPE (msymbol) == mst_file_data))
16107+
return {msymbol, objfile};
16108+
}
16109+
}
16110+
--- gdb-10.2/gdb/symtab.h.orig
16111+
+++ gdb-10.2/gdb/symtab.h
16112+
@@ -1110,7 +1110,7 @@ struct symbol : public general_symbol_info, public allocate_on_obstack
16113+
is_objfile_owned (1),
16114+
is_argument (0),
16115+
is_inlined (0),
16116+
- maybe_copied (0),
16117+
+ maybe_copied (1), /* The objfile potentially supports copy relocations. */
16118+
subclass (SYMBOL_NONE)
16119+
{
16120+
/* We can't use an initializer list for members of a base class, and

0 commit comments

Comments
 (0)