[HWASan] [MTE] disable MTE for HWASan binaries

Bug: 389848256
Test: atest hwasan_test with persist.arm64.memtag.default=sync
Test: atest bionic-unit-tests[-static]
Change-Id: I871932af1ed763e3b7d5f580052a009d5aa02e7d
diff --git a/libc/bionic/libc_init_mte.cpp b/libc/bionic/libc_init_mte.cpp
index eda2eec..d23b056 100644
--- a/libc/bionic/libc_init_mte.cpp
+++ b/libc/bionic/libc_init_mte.cpp
@@ -246,6 +246,7 @@
 __attribute__((no_sanitize("hwaddress", "memtag"))) void __libc_init_mte(
     const memtag_dynamic_entries_t* memtag_dynamic_entries, const void* phdr_start, size_t phdr_ct,
     uintptr_t load_bias) {
+  if (__libc_shared_globals()->is_hwasan) return;
   bool memtag_stack = false;
   HeapTaggingLevel level =
       __get_tagging_level(memtag_dynamic_entries, phdr_start, phdr_ct, load_bias, &memtag_stack);
diff --git a/libc/bionic/libc_init_static.cpp b/libc/bionic/libc_init_static.cpp
index 85e742c..0c962ff 100644
--- a/libc/bionic/libc_init_static.cpp
+++ b/libc/bionic/libc_init_static.cpp
@@ -167,7 +167,7 @@
 }
 
 __attribute__((no_sanitize("memtag"))) __noreturn static void __real_libc_init(
-    KernelArgumentBlock& args, void* raw_args, void (*onexit)(void) __unused,
+    KernelArgumentBlock& args, void* raw_args __unused, void (*onexit)(void) __unused,
     int (*slingshot)(int, char**, char**), structors_array_t const* const structors,
     bionic_tcb* temp_tcb) {
   BIONIC_STOP_UNWIND;
@@ -180,10 +180,12 @@
   layout_static_tls(args);
   __libc_init_main_thread_final();
   __libc_init_common();
+#if !__has_feature(hwaddress_sanitizer)
   __libc_init_mte(/*memtag_dynamic_entries=*/nullptr,
                   reinterpret_cast<ElfW(Phdr)*>(getauxval(AT_PHDR)), getauxval(AT_PHNUM),
                   /*load_bias = */ 0);
   __libc_init_mte_stack(/*stack_top = */ raw_args);
+#endif
   __libc_init_scudo();
   __libc_globals.mutate(__libc_init_malloc);
   __libc_init_profiling_handlers();
@@ -205,8 +207,9 @@
   if (structors->fini_array_count > 0) {
     __cxa_atexit(call_fini_array, const_cast<structors_array_t*>(structors), nullptr);
   }
-
+#if !__has_feature(hwaddress_sanitizer)
   __libc_init_mte_late();
+#endif
 
   exit(slingshot(args.argc, args.argv, args.envp));
 }
diff --git a/libc/private/bionic_globals.h b/libc/private/bionic_globals.h
index 77ac21f..2346a4d 100644
--- a/libc/private/bionic_globals.h
+++ b/libc/private/bionic_globals.h
@@ -152,6 +152,8 @@
   bool initial_memtag_stack_abi = false;
   int64_t heap_tagging_upgrade_timer_sec = 0;
 
+  bool is_hwasan = false;
+
   void (*memtag_stack_dlopen_callback)() = nullptr;
   pthread_mutex_t crash_detail_page_lock = PTHREAD_MUTEX_INITIALIZER;
   crash_detail_page_t* crash_detail_page = nullptr;
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 2393f13..742f639 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -3614,14 +3614,7 @@
   return kLdConfigFilePath;
 }
 
-
-std::vector<android_namespace_t*> init_default_namespaces(const char* executable_path) {
-  g_default_namespace.set_name("(default)");
-
-  soinfo* somain = solist_get_somain();
-
-  const char *interp = phdr_table_get_interpreter_name(somain->phdr, somain->phnum,
-                                                       somain->load_bias);
+void init_sanitizer_mode(const char *interp ) {
   const char* bname = (interp != nullptr) ? basename(interp) : nullptr;
 
   g_is_asan = bname != nullptr &&
@@ -3637,7 +3630,13 @@
   g_is_hwasan = (bname != nullptr &&
               strcmp(bname, "linker_hwasan64") == 0) ||
               (hwasan_env != nullptr && !getauxval(AT_SECURE) && strcmp(hwasan_env, "1") == 0);
+  __libc_shared_globals()->is_hwasan = g_is_hwasan;
 #endif
+}
+
+std::vector<android_namespace_t*> init_default_namespaces(const char* executable_path) {
+  g_default_namespace.set_name("(default)");
+
   const Config* config = nullptr;
 
   {
diff --git a/linker/linker_main.cpp b/linker/linker_main.cpp
index 40f6b9a..425bcda 100644
--- a/linker/linker_main.cpp
+++ b/linker/linker_main.cpp
@@ -366,6 +366,7 @@
   }
   solinker->set_realpath(interp);
   init_link_map_head(*solinker);
+  init_sanitizer_mode(interp);
 
 #if defined(__aarch64__)
   __libc_init_mte(somain->memtag_dynamic_entries(), somain->phdr, somain->phnum, somain->load_bias);
diff --git a/linker/linker_main.h b/linker/linker_main.h
index ffbcf0f..bec9d35 100644
--- a/linker/linker_main.h
+++ b/linker/linker_main.h
@@ -48,6 +48,7 @@
 
 class ElfReader;
 
+void init_sanitizer_mode(const char *interp);
 std::vector<android_namespace_t*> init_default_namespaces(const char* executable_path);
 soinfo* soinfo_alloc(android_namespace_t* ns, const char* name,
                      const struct stat* file_stat, off64_t file_offset,
diff --git a/tests/memtag_stack_test.cpp b/tests/memtag_stack_test.cpp
index 9d02830..98e340a 100644
--- a/tests/memtag_stack_test.cpp
+++ b/tests/memtag_stack_test.cpp
@@ -19,6 +19,7 @@
 #include <gtest/gtest.h>
 
 #if defined(__BIONIC__)
+#include <android-base/test_utils.h>
 #include "gtest_globals.h"
 #include "platform/bionic/mte.h"
 #include "utils.h"
@@ -32,6 +33,9 @@
     GTEST_SKIP() << "MTE unsupported";
   }
   bool is_static = std::get<1>(GetParam());
+  if (running_with_hwasan() && !is_static) {
+    GTEST_SKIP() << "Can't run with HWASanified libc.so";
+  }
   std::string helper =
       GetTestLibRoot() + (is_static ? "/stack_tagging_static_helper" : "/stack_tagging_helper");
   const char* arg = std::get<0>(GetParam());