| Message ID | 20260708143639.2214689-1-christina.schimpe@intel.com |
|---|---|
| Headers |
Return-Path: <gdb-patches-bounces~patchwork=sourceware.org@sourceware.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 968484BA543C for <patchwork@sourceware.org>; Wed, 8 Jul 2026 14:37:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 968484BA543C Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=iSXE6fr7 X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.15]) by sourceware.org (Postfix) with ESMTPS id 0332B4BA543C for <gdb-patches@sourceware.org>; Wed, 8 Jul 2026 14:37:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0332B4BA543C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0332B4BA543C Authentication-Results: sourceware.org; arc=none smtp.remote-ip=198.175.65.15 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783521423; cv=none; b=xabUgKVG1Rgt+dulkID844PJMHGZlcFggVrWP1velLOiL/VE0W1B/TuVeT8mRiRzpi5FLtrBFQ2cQJpXJ0slhR/J37RpATv9LdEqYfrSocx4uerbQmfFw1KzNK5l4rn1WdlYGgK3nFqBh+JN3IbHk9tnz99Z8N2LhJBjTyVVaZM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783521423; c=relaxed/simple; bh=TUzsgoBAiVfQkBYHJaD/AZxDj0oDVDfjYpsYkZdh05w=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=E2jAzUhIhpPWmsRkr3+avOtFt7DHiddolnLBzJFtxZBQ2jIS+7AysaWopFXZyXtxulgwjpZjUwTNDUbYVh070sUTJwGYfQdK6KQEkFfbf6qIEQHB+yndV80jxFjmWC/wBwDIGXd59+p/Zg657WlAkq9EtlVU+IHEetOF5iITZwQ= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=iSXE6fr7 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0332B4BA543C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1783521423; x=1815057423; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=TUzsgoBAiVfQkBYHJaD/AZxDj0oDVDfjYpsYkZdh05w=; b=iSXE6fr7q5eh2EB3esSAOcNtPuV/4aFkpUR5B7vTVWBxc7RY/Tpms+1N ace9cp1Aij77N1tf9xM5nbEg2FtLv55nUHrHiowGeuWCKmIkKRfESiUXL OE9zLB00+2Kseb2voE3a/yPUnryltINy32syzna1fkNYhd3ghfJ3zCHQg k6gb56BJEymBcUzmJKkcg1+Mu677thMs9VChs8Dx4LCPSCdRZiIG1Axve Nfp3fgwtaZoNB4NRd4xcOPtgzuZWu/Hdi4HfY2bluaMxj8iWWDkkVC4ql s/WM3FswlLnMrtR1M8lCLigRcvEkN5jnLVWPcdSoMzL73zU71olOIPWd0 Q==; X-CSE-ConnectionGUID: 9deBZeITTxS8IFxsd0SlUA== X-CSE-MsgGUID: Uidd5TVoRC2QMw5V9K2e/g== X-IronPort-AV: E=McAfee;i="6800,10657,11841"; a="87867472" X-IronPort-AV: E=Sophos;i="6.25,153,1779174000"; d="scan'208";a="87867472" Received: from orviesa006.jf.intel.com ([10.64.159.146]) by orvoesa107.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jul 2026 07:37:02 -0700 X-CSE-ConnectionGUID: pCyrIKFIQjePlQT30xckYA== X-CSE-MsgGUID: 5h/WiiyoQVakUR0g2yOHzg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,153,1779174000"; d="scan'208";a="252560241" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by orviesa006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jul 2026 07:37:00 -0700 From: Christina Schimpe <christina.schimpe@intel.com> 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 Date: Wed, 8 Jul 2026 14:36:26 +0000 Message-Id: <20260708143639.2214689-1-christina.schimpe@intel.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, SPF_HELO_NONE, TXREP, T_SPF_TEMPERROR shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list <gdb-patches.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/gdb-patches>, <mailto:gdb-patches-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/gdb-patches/> List-Post: <mailto:gdb-patches@sourceware.org> List-Help: <mailto:gdb-patches-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/gdb-patches>, <mailto:gdb-patches-request@sourceware.org?subject=subscribe> Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org |
| 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
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.
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.