Skip to content

Commit

Permalink
gdb: fix "p" command to print module variables correctly
Browse files Browse the repository at this point in the history
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 <lijiang@redhat.com>
  • Loading branch information
lian-bo authored and k-hagio committed Apr 22, 2024
1 parent 7d4daf0 commit eedf12d
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions gdb-10.2.patch
Original file line number Diff line number Diff line change
Expand Up @@ -16094,3 +16094,27 @@ exit 0
+{
+ loongarch_elf_fpregset.collect_regset (NULL, regcache, regno, fpregset, sizeof (prfpregset_t));
+}
--- 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

0 comments on commit eedf12d

Please sign in to comment.