Revert "Add a memtag-globals test to bionic"

Revert submission 2709995

Reason for revert: linker crash in soinfo::apply_relr_reloc

Reverted changes: /q/submissionid:2709995

Bug: 314038442
Change-Id: I416bff00ed3d530b3b6257362b2119c358e1d152
diff --git a/tests/Android.bp b/tests/Android.bp
index 3aea968..14b4e3e 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -353,89 +353,6 @@
     },
 }
 
-cc_defaults {
-    name: "memtag_globals_defaults",
-    defaults: [
-        "bionic_testlib_defaults",
-        "bionic_targets_only"
-    ],
-    cflags: [
-        "-Wno-array-bounds",
-        "-Wno-unused-variable",
-    ],
-    header_libs: ["bionic_libc_platform_headers"],
-    sanitize: {
-        hwaddress: false,
-        memtag_heap: true,
-        memtag_globals: true,
-        diag: {
-            memtag_heap: true,
-        }
-    },
-    relative_install_path: "bionic-loader-test-libs/prebuilt-elf-files",
-}
-
-/// The following library and binary is to be used for testing the bionic linker
-/// against memtag globals. While we wait for the compiler to be updated, the
-/// files come as prebuilts (built using) the corresponding 'regular'
-/// cc_test_library and cc_test rules below, just with a tip-of-tree version of
-/// LLVM.
-///
-/// Updating the prebuilts can be done by installing a tip-of-tree compiler, and
-/// running:
-///  - m memtag_globals_binary memtag_globals_dso
-///  - cp $ANDROID_PRODUCT_OUT/symbols/data/nativetest64/bionic-loader-test-libs/prebuilt-elf-files/memtag_globals_* \
-///    $ANDROID_BUILD_TOP/bionic/tests/prebuilt-elf-files/arm64/
-///
-// cc_test_library {
-//     name: "memtag_globals_dso",
-//     defaults: [ "memtag_globals_defaults" ],
-//     srcs: ["prebuilt-elf-files/arm64/src/memtag_globals_dso.cpp"],
-// }
-//
-// cc_test {
-//     name: "memtag_globals_binary",
-//     // Not actually a '.so' file, this is an executable; but the only way to
-//     // get soong to be able to produce a properly located and linked prebuilt
-//     // variant of this binary was through the cc_prebuilt_test_library_shared
-//     // rule, which appends '.so' to the end. Once the prebuilts are removed,
-//     // the suffix can be removed.
-//     suffix: ".so",
-//     defaults: [ "memtag_globals_defaults" ],
-//     srcs: ["prebuilt-elf-files/arm64/src/memtag_globals_binary.cpp"],
-//     shared_libs: [ "memtag_globals_dso" ],
-//     // This binary is used in the bionic-unit-tests as a data dependency, and is
-//     // in the same folder as memtag_globals_dso. But, the default cc_test rules
-//     // make this binary (when just explicitly built and shoved in
-//     // /data/nativetest64/) end up in a subfolder called
-//     // 'memtag_globals_binary'. When this happens, the explicit build fails to
-//     // find the DSO because the default rpath is just ${ORIGIN}, and because we
-//     // want this to be usable both from bionic-unit-tests and explicit builds,
-//     // let's just not put it in a subdirectory.
-//     no_named_install_directory: true,
-// }
-
-cc_prebuilt_test_library_shared {
-    name: "memtag_globals_dso",
-    defaults: [ "memtag_globals_defaults" ],
-    arch: {
-        arm64: {
-            srcs: ["prebuilt-elf-files/arm64/memtag_globals_dso.so"],
-        },
-    }
-}
-
-cc_prebuilt_test_library_shared {
-    name: "memtag_globals_binary",
-    defaults: [ "memtag_globals_defaults" ],
-    arch: {
-        arm64: {
-            srcs: ["prebuilt-elf-files/arm64/memtag_globals_binary.so"],
-            shared_libs: [ "memtag_globals_dso" ],
-        },
-    }
-}
-
 // -----------------------------------------------------------------------------
 // All standard tests.
 // -----------------------------------------------------------------------------
@@ -510,7 +427,6 @@
         "math_test.cpp",
         "membarrier_test.cpp",
         "memtag_stack_test.cpp",
-        "memtag_globals_test.cpp",
         "mntent_test.cpp",
         "mte_test.cpp",
         "netdb_test.cpp",
@@ -966,8 +882,6 @@
         "preinit_syscall_test_helper",
         "thread_exit_cb_helper",
         "tls_properties_helper",
-        "memtag_globals_binary",
-        "memtag_globals_dso",
     ],
     data_libs: [
         "libatest_simple_zip",
diff --git a/tests/memtag_globals_test.cpp b/tests/memtag_globals_test.cpp
deleted file mode 100644
index 3736d4c..0000000
--- a/tests/memtag_globals_test.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <gtest/gtest.h>
-
-#if defined(__BIONIC__)
-#include "gtest_globals.h"
-#include "platform/bionic/mte.h"
-#include "utils.h"
-#endif
-
-#include <sys/stat.h>
-#include <unistd.h>
-#include <string>
-
-TEST(MemtagGlobalsTest, test) {
-#if defined(__BIONIC__) && defined(__aarch64__)
-  std::string binary = GetPrebuiltElfDir() + "/memtag_globals_binary.so";
-  chmod(binary.c_str(), 0755);
-  ExecTestHelper eth;
-  eth.SetArgs({binary.c_str(), nullptr});
-  eth.Run(
-      [&]() {
-        execve(binary.c_str(), eth.GetArgs(), eth.GetEnv());
-        GTEST_FAIL() << "Failed to execve: " << strerror(errno) << "\n";
-      },
-      // We catch the global-buffer-overflow and crash only when MTE is
-      // supported.
-      mte_supported() ? -SIGSEGV : 0, "Assertions were passed");
-#else
-  GTEST_SKIP() << "bionic/arm64 only";
-#endif
-}
diff --git a/tests/prebuilt-elf-files/arm64/memtag_globals_binary.so b/tests/prebuilt-elf-files/arm64/memtag_globals_binary.so
deleted file mode 100755
index 43d7443..0000000
--- a/tests/prebuilt-elf-files/arm64/memtag_globals_binary.so
+++ /dev/null
Binary files differ
diff --git a/tests/prebuilt-elf-files/arm64/memtag_globals_dso.so b/tests/prebuilt-elf-files/arm64/memtag_globals_dso.so
deleted file mode 100755
index f472a70..0000000
--- a/tests/prebuilt-elf-files/arm64/memtag_globals_dso.so
+++ /dev/null
Binary files differ
diff --git a/tests/prebuilt-elf-files/arm64/src/memtag_globals.h b/tests/prebuilt-elf-files/arm64/src/memtag_globals.h
deleted file mode 100644
index b9a2ef1..0000000
--- a/tests/prebuilt-elf-files/arm64/src/memtag_globals.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <utility>
-#include <vector>
-
-void check_tagged(const void* a);
-void check_untagged(const void* a);
-void check_matching_tags(const void* a, const void* b);
-void check_eq(const void* a, const void* b);
-
-void dso_check_assertions(bool enforce_tagged);
-void dso_print_variables();
-
-void print_variable_address(const char* name, const void* ptr);
-void print_variables(const char* header,
-                     const std::vector<std::pair<const char*, const void*>>& tagged_variables,
-                     const std::vector<std::pair<const char*, const void*>>& untagged_variables);
\ No newline at end of file
diff --git a/tests/prebuilt-elf-files/arm64/src/memtag_globals_binary.cpp b/tests/prebuilt-elf-files/arm64/src/memtag_globals_binary.cpp
deleted file mode 100644
index c9ad261..0000000
--- a/tests/prebuilt-elf-files/arm64/src/memtag_globals_binary.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <string>
-#include <vector>
-
-#include "memtag_globals.h"
-
-// Adapted from the LLD test suite: lld/test/ELF/Inputs/aarch64-memtag-globals.s
-
-/// Global variables defined here, of various semantics.
-char global[30] = {};
-__attribute__((no_sanitize("memtag"))) int global_untagged = 0;
-const int const_global = 0;
-static const int hidden_const_global = 0;
-static char hidden_global[12] = {};
-__attribute__((visibility("hidden"))) int hidden_attr_global = 0;
-__attribute__((visibility("hidden"))) const int hidden_attr_const_global = 0;
-
-/// Should be untagged.
-__thread int tls_global;
-__thread static int hidden_tls_global;
-
-/// Tagged, from the other file.
-extern int global_extern;
-/// Untagged, from the other file.
-extern __attribute__((no_sanitize("memtag"))) int global_extern_untagged;
-/// Tagged here, but untagged in the definition found in the sister objfile
-/// (explicitly).
-extern int global_extern_untagged_definition_but_tagged_import;
-
-/// ABS64 relocations. Also, forces symtab entries for local and external
-/// globals.
-char* pointer_to_global = &global[0];
-char* pointer_inside_global = &global[17];
-char* pointer_to_global_end = &global[30];
-char* pointer_past_global_end = &global[48];
-int* pointer_to_global_untagged = &global_untagged;
-const int* pointer_to_const_global = &const_global;
-/// RELATIVE relocations.
-const int* pointer_to_hidden_const_global = &hidden_const_global;
-char* pointer_to_hidden_global = &hidden_global[0];
-int* pointer_to_hidden_attr_global = &hidden_attr_global;
-const int* pointer_to_hidden_attr_const_global = &hidden_attr_const_global;
-/// RELATIVE relocations with special AArch64 MemtagABI semantics, with the
-/// offset ('12' or '16') encoded in the place.
-char* pointer_to_hidden_global_end = &hidden_global[12];
-char* pointer_past_hidden_global_end = &hidden_global[16];
-/// ABS64 relocations.
-int* pointer_to_global_extern = &global_extern;
-int* pointer_to_global_extern_untagged = &global_extern_untagged;
-int* pointer_to_global_extern_untagged_definition_but_tagged_import =
-    &global_extern_untagged_definition_but_tagged_import;
-
-// Force materialization of these globals into the symtab.
-int* get_address_to_tls_global() {
-  return &tls_global;
-}
-int* get_address_to_hidden_tls_global() {
-  return &hidden_tls_global;
-}
-
-static const std::vector<std::pair<const char*, const void*>>& get_expected_tagged_vars() {
-  static std::vector<std::pair<const char*, const void*>> expected_tagged_vars = {
-      {"global", &global},
-      {"pointer_inside_global", pointer_inside_global},
-      {"pointer_to_global_end", pointer_to_global_end},
-      {"pointer_past_global_end", pointer_past_global_end},
-      {"hidden_global", &hidden_global},
-      {"hidden_attr_global", &hidden_attr_global},
-      {"global_extern", &global_extern},
-  };
-  return expected_tagged_vars;
-}
-
-static const std::vector<std::pair<const char*, const void*>>& get_expected_untagged_vars() {
-  static std::vector<std::pair<const char*, const void*>> expected_untagged_vars = {
-      {"global_extern_untagged", &global_extern_untagged},
-      {"global_extern_untagged_definition_but_tagged_import",
-       &global_extern_untagged_definition_but_tagged_import},
-      {"global_untagged", &global_untagged},
-      {"const_global", &const_global},
-      {"hidden_const_global", &hidden_const_global},
-      {"hidden_attr_const_global", &hidden_attr_const_global},
-      {"tls_global", &tls_global},
-      {"hidden_tls_global", &hidden_tls_global},
-  };
-  return expected_untagged_vars;
-}
-
-void exe_print_variables() {
-  print_variables("  Variables accessible from the binary:\n", get_expected_tagged_vars(),
-                  get_expected_untagged_vars());
-}
-
-// Dump the addresses of the global variables to stderr
-void dso_print();
-void dso_print_others();
-
-void exe_check_assertions(bool check_pointers_are_tagged) {
-  // Check that non-const variables are writeable.
-  *pointer_to_global = 0;
-  *pointer_inside_global = 0;
-  *(pointer_to_global_end - 1) = 0;
-  *pointer_to_global_untagged = 0;
-  *pointer_to_hidden_global = 0;
-  *pointer_to_hidden_attr_global = 0;
-  *(pointer_to_hidden_global_end - 1) = 0;
-  *pointer_to_global_extern = 0;
-  *pointer_to_global_extern_untagged = 0;
-  *pointer_to_global_extern_untagged_definition_but_tagged_import = 0;
-
-  if (check_pointers_are_tagged) {
-    for (const auto& [_, pointer] : get_expected_tagged_vars()) {
-      check_tagged(pointer);
-    }
-  }
-
-  for (const auto& [_, pointer] : get_expected_untagged_vars()) {
-    check_untagged(pointer);
-  }
-
-  check_matching_tags(pointer_to_global, pointer_inside_global);
-  check_matching_tags(pointer_to_global, pointer_to_global_end);
-  check_matching_tags(pointer_to_global, pointer_past_global_end);
-  check_eq(pointer_inside_global, pointer_to_global + 17);
-  check_eq(pointer_to_global_end, pointer_to_global + 30);
-  check_eq(pointer_past_global_end, pointer_to_global + 48);
-
-  check_matching_tags(pointer_to_hidden_global, pointer_to_hidden_global_end);
-  check_matching_tags(pointer_to_hidden_global, pointer_past_hidden_global_end);
-  check_eq(pointer_to_hidden_global_end, pointer_to_hidden_global + 12);
-  check_eq(pointer_past_hidden_global_end, pointer_to_hidden_global + 16);
-}
-
-void crash() {
-  *pointer_past_global_end = 0;
-}
-
-int main(int argc, char** argv) {
-  bool check_pointers_are_tagged = false;
-  // For an MTE-capable device, provide argv[1] == '1' to enable the assertions
-  // that pointers should be tagged.
-  if (argc >= 2 && argv[1][0] == '1') {
-    check_pointers_are_tagged = true;
-  }
-
-  char* heap_ptr = static_cast<char*>(malloc(1));
-  print_variable_address("heap address", heap_ptr);
-  *heap_ptr = 0;
-  if (check_pointers_are_tagged) check_tagged(heap_ptr);
-  free(heap_ptr);
-
-  exe_print_variables();
-  dso_print_variables();
-
-  exe_check_assertions(check_pointers_are_tagged);
-  dso_check_assertions(check_pointers_are_tagged);
-
-  printf("Assertions were passed. Now doing a global-buffer-overflow.\n");
-  fflush(stdout);
-  crash();
-  printf("global-buffer-overflow went uncaught.\n");
-  return 0;
-}
\ No newline at end of file
diff --git a/tests/prebuilt-elf-files/arm64/src/memtag_globals_dso.cpp b/tests/prebuilt-elf-files/arm64/src/memtag_globals_dso.cpp
deleted file mode 100644
index 877108e..0000000
--- a/tests/prebuilt-elf-files/arm64/src/memtag_globals_dso.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <vector>
-
-#include "memtag_globals.h"
-
-// Adapted from the LLD test suite: lld/test/ELF/Inputs/aarch64-memtag-globals.s
-
-int global_extern;
-static int global_extern_hidden;
-__attribute__((no_sanitize("memtag"))) int global_extern_untagged;
-__attribute__((no_sanitize("memtag"))) int global_extern_untagged_definition_but_tagged_import;
-
-void assertion_failure() {
-  exit(1);
-}
-
-void check_tagged(const void* a) {
-  uintptr_t a_uptr = reinterpret_cast<uintptr_t>(a);
-#if defined(__aarch64__)
-  if ((a_uptr >> 56) == 0) {
-    fprintf(stderr, "**********************************\n");
-    fprintf(stderr, "Failed assertion:\n");
-    fprintf(stderr, "  tag(0x%zx) != 0\n", a_uptr);
-    fprintf(stderr, "**********************************\n");
-
-    assertion_failure();
-  }
-#endif  // defined(__aarch64__)
-}
-
-void check_untagged(const void* a) {
-  uintptr_t a_uptr = reinterpret_cast<uintptr_t>(a);
-#if defined(__aarch64__)
-  if ((a_uptr >> 56) != 0) {
-    fprintf(stderr, "**********************************\n");
-    fprintf(stderr, "Failed assertion:\n");
-    fprintf(stderr, "  tag(0x%zx) == 0\n", a_uptr);
-    fprintf(stderr, "**********************************\n");
-
-    assertion_failure();
-  }
-#endif  // defined(__aarch64__)
-}
-
-void check_matching_tags(const void* a, const void* b) {
-  uintptr_t a_uptr = reinterpret_cast<uintptr_t>(a);
-  uintptr_t b_uptr = reinterpret_cast<uintptr_t>(b);
-#if defined(__aarch64__)
-  if (a_uptr >> 56 != b_uptr >> 56) {
-    fprintf(stderr, "**********************************\n");
-    fprintf(stderr, "Failed assertion:\n");
-    fprintf(stderr, "  tag(0x%zx) != tag(0x%zx)\n", a_uptr, b_uptr);
-    fprintf(stderr, "**********************************\n");
-
-    assertion_failure();
-  }
-#endif  // defined(__aarch64__)
-}
-
-void check_eq(const void* a, const void* b) {
-  if (a != b) {
-    fprintf(stderr, "**********************************\n");
-    fprintf(stderr, "Failed assertion:\n");
-    fprintf(stderr, "  %p != %p\n", a, b);
-    fprintf(stderr, "**********************************\n");
-
-    assertion_failure();
-  }
-}
-
-#define LONGEST_VARIABLE_NAME "51"
-void print_variable_address(const char* name, const void* ptr) {
-  printf("%" LONGEST_VARIABLE_NAME "s: %16p\n", name, ptr);
-}
-
-static const std::vector<std::pair<const char*, const void*>>& get_expected_tagged_vars() {
-  static std::vector<std::pair<const char*, const void*>> expected_tagged_vars = {
-      {"global_extern", &global_extern},
-      {"global_extern_hidden", &global_extern_hidden},
-  };
-  return expected_tagged_vars;
-}
-
-static const std::vector<std::pair<const char*, const void*>>& get_expected_untagged_vars() {
-  static std::vector<std::pair<const char*, const void*>> expected_untagged_vars = {
-      {"global_extern_untagged", &global_extern_untagged},
-      {"global_extern_untagged_definition_but_tagged_import",
-       &global_extern_untagged_definition_but_tagged_import},
-  };
-  return expected_untagged_vars;
-}
-
-void dso_print_variables() {
-  print_variables("  Variables declared in the DSO:\n", get_expected_tagged_vars(),
-                  get_expected_untagged_vars());
-}
-
-void print_variables(const char* header,
-                     const std::vector<std::pair<const char*, const void*>>& tagged_variables,
-                     const std::vector<std::pair<const char*, const void*>>& untagged_variables) {
-  printf("==========================================================\n");
-  printf("%s", header);
-  printf("==========================================================\n");
-  printf(" Variables expected to be tagged:\n");
-  printf("----------------------------------------------------------\n");
-  for (const auto& [name, pointer] : tagged_variables) {
-    print_variable_address(name, pointer);
-  }
-
-  printf("\n----------------------------------------------------------\n");
-  printf(" Variables expected to be untagged:\n");
-  printf("----------------------------------------------------------\n");
-  for (const auto& [name, pointer] : untagged_variables) {
-    print_variable_address(name, pointer);
-  }
-  printf("\n");
-}
-
-void dso_check_assertions(bool check_pointers_are_tagged) {
-  // Check that non-const variables are writeable.
-  global_extern = 0;
-  global_extern_hidden = 0;
-  global_extern_untagged = 0;
-  global_extern_untagged_definition_but_tagged_import = 0;
-
-  if (check_pointers_are_tagged) {
-    for (const auto& [_, pointer] : get_expected_tagged_vars()) {
-      check_tagged(pointer);
-    }
-  }
-
-  for (const auto& [_, pointer] : get_expected_untagged_vars()) {
-    check_untagged(pointer);
-  }
-}