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. 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) -- 2.43.0