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)