On 5/1/25 12:01 PM, Richard Sandiford wrote:
Indu Bhagat <indu.bha...@oracle.com> writes:
In context of stack tagging, the AArch64 Memtag ABI Extension to ELF
specifies the usage of two dynamic tags for the dynamic loader to do the
necessary tasks:
   - If DT_AARCH64_MEMTAG_MODE is present, the dynamic loader should (in
     a platform-specific specific way) enable MTE for the process.
   - If DT_AARCH64_MEMTAG_STACK is present, the dynamic loader should
     enable tagging for the main stack and thread stacks.

Make changes in the link spec so appropriate command line options can be
passed to ld.

The two (proposed) command line options added to ld are:
   -z memtag-mode=<mode>
   -z memtag-stack

On the GCC side, the user can:
   - Enable MTE stack tagging using -fsanitize=memtag
   - Select the MTE mode by using -fsanitize-memtag-mode=mode.

TBD:
  - We need to check explicitly for stack tagging; sanitize(memtag) does
    not appear to be enough.  Because -fsanitize=memtag will also be used
    for MTE tagging of globals later.  On a related note, clang has two
    explicit options: -fsanitize=memtag-stack and -fsanitize=memtag-globals.

Yeah, I think we should aim for option compatibility with Clang unless
there's a specific reason not to.  In a way, getting rid of the associated
--params is a feature, since --params are supposed to be developer options
that can go away at any time.


OK. I've changed the patches to now use -fsanitize=memtag-stack in the patch series. Later when GCC adds support for -fsanitize=memtag-globals, we can also add a -fsanitize=memtag as a convenience option, like what clang does.

I've removed the param memtag-instrument-stack, now that we have a first class option for controlling MTE for stack (-fsanitize=memtag-stack). The param memtag-instrument-allocas remains.


gcc/ChangeLog:

         * config/aarch64/aarch64-linux.h: Update LINUX_TARGET_LINK_SPEC
        macro.
         * gcc.cc (sanitize_spec_function): Add check for memtag.

---
[New in RFC V2]
---
  gcc/config/aarch64/aarch64-linux.h | 4 +++-
  gcc/gcc.cc                         | 2 ++
  2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/gcc/config/aarch64/aarch64-linux.h 
b/gcc/config/aarch64/aarch64-linux.h
index 116bb4e69f37..a5e5f8bb5ac5 100644
--- a/gcc/config/aarch64/aarch64-linux.h
+++ b/gcc/config/aarch64/aarch64-linux.h
@@ -48,7 +48,9 @@
     %{static-pie:-Bstatic -pie --no-dynamic-linker -z text} \
     -X                                         \
     %{mbig-endian:-EB} %{mlittle-endian:-EL}     \
-   -maarch64linux%{mabi=ilp32:32}%{mbig-endian:b}"
+   -maarch64linux%{mabi=ilp32:32}%{mbig-endian:b} \
+   %{%:sanitize(memtag):%{!fsanitize-memtag-mode:-z memtag-stack -z 
memtag-mode=sync}} \
+   %{%:sanitize(memtag):%{fsanitize-memtag-mode=*:-z memtag-stack -z 
memtag-mode=%}}"
#define LINK_SPEC LINUX_TARGET_LINK_SPEC AARCH64_ERRATA_LINK_SPEC
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index aac33e91a9a0..5beb793b075c 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -10443,6 +10443,8 @@ sanitize_spec_function (int argc, const char **argv)
      return (flag_sanitize & SANITIZE_KERNEL_ADDRESS) ? "" : NULL;
    if (strcmp (argv[0], "kernel-hwaddress") == 0)
      return (flag_sanitize & SANITIZE_KERNEL_HWADDRESS) ? "" : NULL;
+  if (strcmp (argv[0], "memtag") == 0)
+    return (flag_sanitize & SANITIZE_MEMTAG) ? "" : NULL;
    if (strcmp (argv[0], "thread") == 0)
      return (flag_sanitize & SANITIZE_THREAD) ? "" : NULL;
    if (strcmp (argv[0], "undefined") == 0)

Reply via email to