Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom de Vries <tdevries@suse.de>
To: gdb-patches@sourceware.org
Subject: [PING][PATCH] [gdb/tui] Don't disassemble non-code sections and section holes
Date: Wed, 2 Sep 2026 18:30:04 +0200	[thread overview]
Message-ID: <81fbd404-d993-4b2b-ba28-4243ba22e2a3@suse.de> (raw)
In-Reply-To: <20260819143514.2221499-1-tdevries@suse.de>

On 8/19/26 4:35 PM, Tom de Vries wrote:
> I was investigating TUI behaviour on ppc64-linux using the executable from
> test-case gdb.tui/basic.exp, and after scrolling in the asm window ended up
> with:
> ...
> +----------------------------------------------------------------------------+
> |   0x920 <__libc_start_main@plt+4> b       0x8f0 <__glink_PLTresolve>       |
> |   0x924 <__gmon_start__@plt>      li      r0,1                             |
> |   0x928 <__gmon_start__@plt+4>    b       0x8f0 <__glink_PLTresolve>       |
> |   0x92c <__cxa_finalize@plt>      li      r0,2                             |
> |   0x930 <__cxa_finalize@plt+4>    b       0x8f0 <__glink_PLTresolve>       |
> |   0x934 <._fini>                  mflr    r0                               |
> |   0x938 <._fini+4>                std     r0,16(r1)                        |
> |   0x93c <._fini+8>                stdu    r1,-112(r1)                      |
> |   0x940 <._fini+12>               addi    r1,r1,112                        |
> |   0x944 <._fini+16>               ld      r0,16(r1)                        |
> |   0x948 <._fini+20>               mtlr    r0                               |
> |   0x94c <._fini+24>               blr                                      |
> |   0x950 <_IO_stdin_used>          .long 0x20001                            |
> |   0x954                           .long 0x11b033b                          |
> |   0x958                           .long 0x18                               |
> |   0x95c                           .long 0x2                                |
> |   0x960                           .long 0xffffff60                         |
> |   0x964                           .long 0x48                               |
> |   0x968                           .long 0xffffff9c                         |
> |   0x96c                           .long 0x30                               |
> +----------------------------------------------------------------------------+
> exec No process (asm) In:                                        L??   PC: ??
> (gdb)
> ...
> 
> The view corresponds to this objdump -D output:
> ...
> Disassembly of section .text:
> 
>    ...
> 
> 000000000000091c <__libc_start_main@plt>:
>   91c:   38 00 00 00     li      r0,0
>   920:   4b ff ff d0     b       8f0 <__glink_PLTresolve>
> 
> 0000000000000924 <__gmon_start__@plt>:
>   924:   38 00 00 01     li      r0,1
>   928:   4b ff ff c8     b       8f0 <__glink_PLTresolve>
> 
> 000000000000092c <__cxa_finalize@plt>:
>   92c:   38 00 00 02     li      r0,2
>   930:   4b ff ff c0     b       8f0 <__glink_PLTresolve>
> 
> Disassembly of section .fini:
> 
> 0000000000000934 <._fini>:
>   934:   7c 08 02 a6     mflr    r0
>   938:   f8 01 00 10     std     r0,16(r1)
>   93c:   f8 21 ff 91     stdu    r1,-112(r1)
>   940:   38 21 00 70     addi    r1,r1,112
>   944:   e8 01 00 10     ld      r0,16(r1)
>   948:   7c 08 03 a6     mtlr    r0
>   94c:   4e 80 00 20     blr
> 
> Disassembly of section .rodata:
> 
> 0000000000000950 <_IO_stdin_used>:
>   950:   00 02 00 01     .long 0x20001
> 
> Disassembly of section .eh_frame_hdr:
> 
> 0000000000000954 <__GNU_EH_FRAME_HDR>:
>   954:   01 1b 03 3b     .long 0x11b033b
>   958:   00 00 00 18     .long 0x18
>   95c:   00 00 00 02     .long 0x2
>   960:   ff ff ff 60     .long 0xffffff60
>   964:   00 00 00 48     .long 0x48
>   968:   ff ff ff 9c     .long 0xffffff9c
>   96c:   00 00 00 30     .long 0x30
> ...
> 
> ISTM that we should not be disassembling the .rodata section.
> 
> My first thought was to require tui_disassemble to stay in the same section,
> but after thinking about it a bit more decided that that was too restrictive,
> and instead went for requiring that we stay in code sections.
> 
> So, I came up with this fix:
> ...
>        struct obj_section *section = find_pc_section (pc);
>        if (section != nullptr
> 	  && (bfd_section_flags (section->the_bfd_section) & SEC_CODE) == 0)
> 	return pc;
> ...
> 
> Then I stumbled on PR tui/34399, which reports not being able to scroll back
> up after scrolling down.  The problem there is that we disassemble code from a
> section hole (0x401034-0x402000):
> ...
> Section Headers:
>    [Nr] Name              Type             Address           Offset
>         Size              EntSize          Flags  Link  Info  Align
>    [ 0]                   NULL             0000000000000000  00000000
>         0000000000000000  0000000000000000           0     0     0
>    [ 1] .note.gnu.pr[...] NOTE             0000000000400190  00000190
>         0000000000000030  0000000000000000   A       0     0     8
>    [ 2] .note.gnu.bu[...] NOTE             00000000004001c0  000001c0
>         0000000000000024  0000000000000000   A       0     0     4
>    [ 3] .text             PROGBITS         0000000000401000  00001000
>         0000000000000034  0000000000000000  AX       0     0     1
>    [ 4] .rodata           PROGBITS         0000000000402000  00002000
>         0000000000000006  0000000000000000   A       0     0     1
>    [ 5] .symtab           SYMTAB           0000000000000000  00002008
>         0000000000000078  0000000000000018           6     1     8
>    [ 6] .strtab           STRTAB           0000000000000000  00002080
>         0000000000000019  0000000000000000           0     0     1
>    [ 7] .shstrtab         STRTAB           0000000000000000  00002099
>         000000000000004f  0000000000000000           0     0     1
> Key to Flags:
>    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
>    L (link order), O (extra OS processing required), G (group), T (TLS),
>    C (compressed), x (unknown), o (OS specific), E (exclude),
>    D (mbind), l (large), p (processor specific)
> ...
> and once we call tui_find_backward_disassembly_start_address with an address
> ADDR for which find_pc_section (ADDR - 1) == nullptr, we are stuck in the
> section hole.
> 
> Fix this by not disassembling section holes.
> 
> This is achieved by slightly modifying the earlier fix:
> ...
>        if (section == nullptr
> 	  || (bfd_section_flags (section->the_bfd_section) & SEC_CODE) == 0)
> 	return pc;
> ...
> 

Ping.

Thanks,
- Tom

> Tested on x86_64-linux and ppc64-linux.
> 
> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34399
> ---
>   gdb/tui/tui-disasm.c | 9 +++++++++
>   1 file changed, 9 insertions(+)
> 
> diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
> index 5c68312a91b..085a6c2903e 100644
> --- a/gdb/tui/tui-disasm.c
> +++ b/gdb/tui/tui-disasm.c
> @@ -112,6 +112,15 @@ tui_disassemble (struct gdbarch *gdbarch,
>       {
>         tui_asm_line tal;
>   
> +      /* Don't disassemble:
> +	 - non-code sections (not appropriate for disassembly window), and
> +	 - section holes (otherwise we can get stuck, unable to scroll back to
> +	   the section before the section hole).  */
> +      struct obj_section *section = find_pc_section (pc);
> +      if (section == nullptr
> +	  || (bfd_section_flags (section->the_bfd_section) & SEC_CODE) == 0)
> +	return pc;
> +
>         /* Save the instruction address.  */
>         tal.addr = pc;
>   
> 
> base-commit: 4ed310516eb76cbf650523a53f733060d3ae71b9


  reply	other threads:[~2026-09-02 16:30 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-19 14:35 [PATCH] " Tom de Vries
2026-09-02 16:30 ` Tom de Vries [this message]
2026-09-04 11:39 ` Guinevere Larsen
2026-09-09 10:41   ` Tom de Vries
2026-09-09 11:19     ` Guinevere Larsen
2026-09-04 15:45 ` Andrew Burgess
2026-09-09 11:27   ` Tom de Vries

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=81fbd404-d993-4b2b-ba28-4243ba22e2a3@suse.de \
    --to=tdevries@suse.de \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox