[v4,00/13] Add new command to print the shadow stack backtrace

Message ID 20260708143639.2214689-1-christina.schimpe@intel.com
Headers
Series Add new command to print the shadow stack backtrace |

Message

Schimpe, Christina July 8, 2026, 2:36 p.m. UTC
  Hi all,

this is my v4 of the series
"Add new command to print the shadow stack backtrace".

***Diff of v4 to v3***:

- Minor fixup for ARM compilation
- The commit
  "gdb: Provide gdbarch hook to distinguish shadow stack backtrace elements."
  was accidentially merged into the previous one
  ("gdb: Add command option 'bt -shadow' to print the shadow stack backtrace.").
  Isolate it again.

Other than that, I am keeping the full cover letter summarizing the
changes for v3 (diff of v3 to v2). It has not been reviewed yet, since I posted
it just a couple days ago.

***Diff of v3 to v2***:

It now includes:
- the implementation of the -past-main command line option
- support for inferior calls
(printing of <function called from gdb> instead of the shadow stack element)
- full support for signals
(printing of <signal handler called> instead of the shadow stack element)

Due to this some larger refactoring was required; I summarized it here:
https://sourceware.org/pipermail/gdb-patches/2026-May/227481.html

The refactoring mostly affected the following commits:
"gdb: Provide gdbarch hook to distinguish shadow stack backtrace elements."
"gdb: Add command option 'bt -shadow' to print the shadow stack backtrace."
"gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64 linux."
I did not add any Reviewed-By or Approved-By tags for the 3 commits, since
they changed significantly.

Furthermore, I addressed (hopefully all) the comments of Tom, Thiago and Eli: 
- Remove annotations
- Some better code reuse (especially for the mi patch)
- A new patch "aarch64: Implement gdbarch function top_addr_empty_shadow_stack."
  This also allows to remove some target dependent GCS code in aarch64-*.c
- Various smaller issues and nits
- Fixes for check-gdbarch.py

And finally some smaller issues I noted myself (mostly for patch #1
"gdb: Generalize handling of the shadow stack pointer."):
- Remove unused gdbarch parameter in some of the introduced hooks
- Changes in gdb/aarch64-tdep.c when calling shadow_stack_push, since
some code for getting the shadow stack pointer and checking the enablement
state was duplicated. 

Opens:
1) Thiago suggested changing the frame numbering so that it always starts
at #1, since for the shadow stack we don't have frame #0 printed by the
normal backtrace.
2) Or, consider printing frame #0 similarly to what the normal backtrace does
3) Consider printing frame arguments (but I believe, if possible, this should
better be added in a follow-up series)
4) Show the selected frame, for details see here:
https://sourceware.org/pipermail/gdb-patches/2026-June/227720.html

This is an example for the output of 'bt -shadow' on amd64 linux:
~~~
(gdb) bt -shadow
#0  0x000055555555514a in call1 at amd64-shadow-stack.c:27
#1  0x000055555555515f in main at amd64-shadow-stack.c:38
~~~

Note that the normal backtrace includes one additional frame, since
the shadow stack backtrace relies on return addresses of the shadow
stack only.  But except the missing frame arguments and frame #0 of
the normal backtrace, the backtrace is the same.
~~~
(gdb) bt
#0  call2 () at amd64-shadow-stack.c:21
#1  0x000055555555514a in call1 () at amd64-shadow-stack.c:27
#2  0x000055555555515f in main () at amd64-shadow-stack.c:38
~~~

I am happy about your feedback!

Christina

v3: https://sourceware.org/pipermail/gdb-patches/2026-July/228440.html
v2: https://sourceware.org/pipermail/gdb-patches/2026-January/224388.html
v1: https://sourceware.org/pipermail/gdb-patches/2025-September/221141.html

Christina Schimpe (13):
  gdb: Generalize handling of the shadow stack pointer.
  aarch64: Implement gdbarch function top_addr_empty_shadow_stack.
  gdb: Add get_main_func_start_pc to refactor frame.c:inside_main_func.
  gdb: Refactor 'stack.c:print_frame'.
  gdb: Introduce 'stack.c:print_pc' function without frame argument.
  gdb: Refactor 'find_symbol_funname' and 'info_frame_command_core' in
    stack.c.
  gdb: Refactor 'stack.c:print_frame_info'.
  gdb: Add command option 'bt -shadow' to print the shadow stack
    backtrace.
  gdb: Provide gdbarch hook to distinguish shadow stack backtrace
    elements.
  gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64
    linux.
  gdb: Enable inferior calls in the shadow stack backtrace.
  gdb: Enable signal trampolines in the shadow stack backtrace.
  gdb, mi: Add -shadow-stack-list-frames command

 gdb/Makefile.in                               |   2 +
 gdb/NEWS                                      |  11 +
 gdb/aarch64-linux-tdep.c                      |  51 +-
 gdb/aarch64-tdep.c                            |  66 +-
 gdb/amd64-linux-tdep.c                        | 211 ++---
 gdb/amd64-tdep.c                              |  22 +
 gdb/doc/gdb.texinfo                           |  95 +++
 gdb/frame.c                                   |  37 +-
 gdb/frame.h                                   |   6 +
 gdb/gdbarch-gen.c                             | 190 ++++-
 gdb/gdbarch-gen.h                             |  95 ++-
 gdb/gdbarch.h                                 |   1 +
 gdb/gdbarch_components.py                     | 124 ++-
 gdb/infcall.c                                 |   4 +-
 gdb/linux-tdep.c                              |   9 +-
 gdb/mi/mi-cmd-stack.c                         | 100 +++
 gdb/mi/mi-cmds.c                              |   2 +
 gdb/mi/mi-cmds.h                              |   1 +
 gdb/shadow-stack.c                            | 769 ++++++++++++++++++
 gdb/shadow-stack.h                            | 182 +++++
 gdb/stack.c                                   | 319 +++++---
 gdb/stack.h                                   |  43 +
 .../amd64-shadow-stack-backtrace-signal.exp   |  49 ++
 .../gdb.arch/amd64-shadow-stack-cmds.exp      |  71 ++
 .../gdb.arch/amd64-shadow-stack-signal.c      |  31 +
 gdb/testsuite/gdb.base/options.exp            |   2 +-
 .../gdb.mi/mi-shadow-stack-signal.exp         |  69 ++
 gdb/testsuite/gdb.mi/mi-shadow-stack.exp      |  93 +++
 28 files changed, 2247 insertions(+), 408 deletions(-)
 create mode 100644 gdb/shadow-stack.c
 create mode 100644 gdb/shadow-stack.h
 create mode 100644 gdb/testsuite/gdb.arch/amd64-shadow-stack-backtrace-signal.exp
 create mode 100644 gdb/testsuite/gdb.arch/amd64-shadow-stack-signal.c
 create mode 100644 gdb/testsuite/gdb.mi/mi-shadow-stack-signal.exp
 create mode 100644 gdb/testsuite/gdb.mi/mi-shadow-stack.exp
  

Comments

Joos, Christina Aug. 4, 2026, 7:45 a.m. UTC | #1
Hi all,

I wanted to give you a heads-up that I will be out for at least half a year for personal reasons starting around late October.
Maybe there is still a chance to get the series in before I leave.

Kind Regards,
Christina

> -----Original Message-----
> From: Christina Schimpe <christina.schimpe@intel.com>
> Sent: Mittwoch, 8. Juli 2026 16:36
> To: gdb-patches@sourceware.org
> Cc: tom@tromey.com; thiago.bauermann@linaro.org
> Subject: [PATCH v4 00/13] Add new command to print the shadow stack
> backtrace
> 
> Hi all,
> 
> this is my v4 of the series
> "Add new command to print the shadow stack backtrace".
> 
> ***Diff of v4 to v3***:
> 
> - Minor fixup for ARM compilation
> - The commit
>   "gdb: Provide gdbarch hook to distinguish shadow stack backtrace elements."
>   was accidentially merged into the previous one
>   ("gdb: Add command option 'bt -shadow' to print the shadow stack
> backtrace.").
>   Isolate it again.
> 
> Other than that, I am keeping the full cover letter summarizing the changes for v3
> (diff of v3 to v2). It has not been reviewed yet, since I posted it just a couple days
> ago.
> 
> ***Diff of v3 to v2***:
> 
> It now includes:
> - the implementation of the -past-main command line option
> - support for inferior calls
> (printing of <function called from gdb> instead of the shadow stack element)
> - full support for signals
> (printing of <signal handler called> instead of the shadow stack element)
> 
> Due to this some larger refactoring was required; I summarized it here:
> https://sourceware.org/pipermail/gdb-patches/2026-May/227481.html
> 
> The refactoring mostly affected the following commits:
> "gdb: Provide gdbarch hook to distinguish shadow stack backtrace elements."
> "gdb: Add command option 'bt -shadow' to print the shadow stack backtrace."
> "gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64
> linux."
> I did not add any Reviewed-By or Approved-By tags for the 3 commits, since they
> changed significantly.
> 
> Furthermore, I addressed (hopefully all) the comments of Tom, Thiago and Eli:
> - Remove annotations
> - Some better code reuse (especially for the mi patch)
> - A new patch "aarch64: Implement gdbarch function
> top_addr_empty_shadow_stack."
>   This also allows to remove some target dependent GCS code in aarch64-*.c
> - Various smaller issues and nits
> - Fixes for check-gdbarch.py
> 
> And finally some smaller issues I noted myself (mostly for patch #1
> "gdb: Generalize handling of the shadow stack pointer."):
> - Remove unused gdbarch parameter in some of the introduced hooks
> - Changes in gdb/aarch64-tdep.c when calling shadow_stack_push, since some
> code for getting the shadow stack pointer and checking the enablement state was
> duplicated.
> 
> Opens:
> 1) Thiago suggested changing the frame numbering so that it always starts at #1,
> since for the shadow stack we don't have frame #0 printed by the normal
> backtrace.
> 2) Or, consider printing frame #0 similarly to what the normal backtrace does
> 3) Consider printing frame arguments (but I believe, if possible, this should better
> be added in a follow-up series)
> 4) Show the selected frame, for details see here:
> https://sourceware.org/pipermail/gdb-patches/2026-June/227720.html
> 
> This is an example for the output of 'bt -shadow' on amd64 linux:
> ~~~
> (gdb) bt -shadow
> #0  0x000055555555514a in call1 at amd64-shadow-stack.c:27
> #1  0x000055555555515f in main at amd64-shadow-stack.c:38 ~~~
> 
> Note that the normal backtrace includes one additional frame, since the shadow
> stack backtrace relies on return addresses of the shadow stack only.  But except
> the missing frame arguments and frame #0 of the normal backtrace, the
> backtrace is the same.
> ~~~
> (gdb) bt
> #0  call2 () at amd64-shadow-stack.c:21
> #1  0x000055555555514a in call1 () at amd64-shadow-stack.c:27
> #2  0x000055555555515f in main () at amd64-shadow-stack.c:38 ~~~
> 
> I am happy about your feedback!
> 
> Christina
> 
> v3: https://sourceware.org/pipermail/gdb-patches/2026-July/228440.html
> v2: https://sourceware.org/pipermail/gdb-patches/2026-January/224388.html
> v1: https://sourceware.org/pipermail/gdb-patches/2025-
> September/221141.html
> 
> Christina Schimpe (13):
>   gdb: Generalize handling of the shadow stack pointer.
>   aarch64: Implement gdbarch function top_addr_empty_shadow_stack.
>   gdb: Add get_main_func_start_pc to refactor frame.c:inside_main_func.
>   gdb: Refactor 'stack.c:print_frame'.
>   gdb: Introduce 'stack.c:print_pc' function without frame argument.
>   gdb: Refactor 'find_symbol_funname' and 'info_frame_command_core' in
>     stack.c.
>   gdb: Refactor 'stack.c:print_frame_info'.
>   gdb: Add command option 'bt -shadow' to print the shadow stack
>     backtrace.
>   gdb: Provide gdbarch hook to distinguish shadow stack backtrace
>     elements.
>   gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64
>     linux.
>   gdb: Enable inferior calls in the shadow stack backtrace.
>   gdb: Enable signal trampolines in the shadow stack backtrace.
>   gdb, mi: Add -shadow-stack-list-frames command
> 
>  gdb/Makefile.in                               |   2 +
>  gdb/NEWS                                      |  11 +
>  gdb/aarch64-linux-tdep.c                      |  51 +-
>  gdb/aarch64-tdep.c                            |  66 +-
>  gdb/amd64-linux-tdep.c                        | 211 ++---
>  gdb/amd64-tdep.c                              |  22 +
>  gdb/doc/gdb.texinfo                           |  95 +++
>  gdb/frame.c                                   |  37 +-
>  gdb/frame.h                                   |   6 +
>  gdb/gdbarch-gen.c                             | 190 ++++-
>  gdb/gdbarch-gen.h                             |  95 ++-
>  gdb/gdbarch.h                                 |   1 +
>  gdb/gdbarch_components.py                     | 124 ++-
>  gdb/infcall.c                                 |   4 +-
>  gdb/linux-tdep.c                              |   9 +-
>  gdb/mi/mi-cmd-stack.c                         | 100 +++
>  gdb/mi/mi-cmds.c                              |   2 +
>  gdb/mi/mi-cmds.h                              |   1 +
>  gdb/shadow-stack.c                            | 769 ++++++++++++++++++
>  gdb/shadow-stack.h                            | 182 +++++
>  gdb/stack.c                                   | 319 +++++---
>  gdb/stack.h                                   |  43 +
>  .../amd64-shadow-stack-backtrace-signal.exp   |  49 ++
>  .../gdb.arch/amd64-shadow-stack-cmds.exp      |  71 ++
>  .../gdb.arch/amd64-shadow-stack-signal.c      |  31 +
>  gdb/testsuite/gdb.base/options.exp            |   2 +-
>  .../gdb.mi/mi-shadow-stack-signal.exp         |  69 ++
>  gdb/testsuite/gdb.mi/mi-shadow-stack.exp      |  93 +++
>  28 files changed, 2247 insertions(+), 408 deletions(-)  create mode 100644
> gdb/shadow-stack.c  create mode 100644 gdb/shadow-stack.h  create mode
> 100644 gdb/testsuite/gdb.arch/amd64-shadow-stack-backtrace-signal.exp
>  create mode 100644 gdb/testsuite/gdb.arch/amd64-shadow-stack-signal.c
>  create mode 100644 gdb/testsuite/gdb.mi/mi-shadow-stack-signal.exp
>  create mode 100644 gdb/testsuite/gdb.mi/mi-shadow-stack.exp
> 
> --
> 2.34.1
> 
> Intel Deutschland GmbH
> 
> Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany
> Tel: +49 89 991 430, www.intel.de
> Managing Directors: Harry Demas, Jeffrey Schneiderman, Yin Chong Sorrell
> Chairperson of the Supervisory Board: Nicole Lau Registered Seat: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
> 

________________________________________
Intel Deutschland GmbH 

Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany 

Tel: +49 (89) 99143-0 

www.intel.de 

Managing Directors: Candice Moore, Jeffrey Schneiderman, Ramachandran Sitaraman

Chairperson of the Supervisory Board: Sonja Pierer

Registered Seat: Munich Commercial Register B: Amtsgericht Munich HRB 186928

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.
  
Thiago Jung Bauermann Sept. 3, 2026, 6:44 a.m. UTC | #2
Hello Christina,

Thank you for this new version and for addressing the review comments.

Also thank you for this detailed cover letter. It's very helpful.

Christina Schimpe <christina.schimpe@intel.com> writes:

> Hi all,
>
> this is my v4 of the series
> "Add new command to print the shadow stack backtrace".
>
> ***Diff of v4 to v3***:
>
> - Minor fixup for ARM compilation
> - The commit
>   "gdb: Provide gdbarch hook to distinguish shadow stack backtrace elements."
>   was accidentially merged into the previous one
>   ("gdb: Add command option 'bt -shadow' to print the shadow stack backtrace.").
>   Isolate it again.
>
> Other than that, I am keeping the full cover letter summarizing the
> changes for v3 (diff of v3 to v2). It has not been reviewed yet, since I posted
> it just a couple days ago.
>
> ***Diff of v3 to v2***:
>
> It now includes:
> - the implementation of the -past-main command line option
> - support for inferior calls
> (printing of <function called from gdb> instead of the shadow stack element)
> - full support for signals
> (printing of <signal handler called> instead of the shadow stack element)

Great improvements!

> Due to this some larger refactoring was required; I summarized it here:
> https://sourceware.org/pipermail/gdb-patches/2026-May/227481.html
>
> The refactoring mostly affected the following commits:
> "gdb: Provide gdbarch hook to distinguish shadow stack backtrace elements."
> "gdb: Add command option 'bt -shadow' to print the shadow stack backtrace."
> "gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64 linux."
> I did not add any Reviewed-By or Approved-By tags for the 3 commits, since
> they changed significantly.
>
> Furthermore, I addressed (hopefully all) the comments of Tom, Thiago and Eli: 
> - Remove annotations
> - Some better code reuse (especially for the mi patch)
> - A new patch "aarch64: Implement gdbarch function top_addr_empty_shadow_stack."
>   This also allows to remove some target dependent GCS code in aarch64-*.c

Nice! Thanks.

> - Various smaller issues and nits
> - Fixes for check-gdbarch.py
>
> And finally some smaller issues I noted myself (mostly for patch #1
> "gdb: Generalize handling of the shadow stack pointer."):
> - Remove unused gdbarch parameter in some of the introduced hooks
> - Changes in gdb/aarch64-tdep.c when calling shadow_stack_push, since
> some code for getting the shadow stack pointer and checking the enablement
> state was duplicated. 
>
> Opens:
> 1) Thiago suggested changing the frame numbering so that it always starts
> at #1, since for the shadow stack we don't have frame #0 printed by the
> normal backtrace.
> 2) Or, consider printing frame #0 similarly to what the normal backtrace does

I still prefer option 1, but I'm also fine if some other option is
chosen. 

> 3) Consider printing frame arguments (but I believe, if possible, this should
> better be added in a follow-up series)

IMHO it's not necessary, but I agree it's for a follow-up series if it
is implemented.

> 4) Show the selected frame, for details see here:
> https://sourceware.org/pipermail/gdb-patches/2026-June/227720.html

It would be nice to show the selected frame. If the selected frame is
frame 0, then I think it's fine to simply not show it.