diff --git a/tests/Android.bp b/tests/Android.bp
index ae8d7fc..c936c5c 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -256,6 +256,7 @@
         "dl_test.cpp",
         "dlfcn_symlink_support.cpp",
         "dlfcn_test.cpp",
+        "link_test.cpp",
         "pthread_dlfcn_test.cpp",
     ],
     static_libs: [
diff --git a/tests/link_test.cpp b/tests/link_test.cpp
new file mode 100644
index 0000000..ac3ccb9
--- /dev/null
+++ b/tests/link_test.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2017 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>
+
+#include <link.h>
+
+TEST(link, dl_iterate_phdr_early_exit) {
+  static size_t call_count = 0;
+  ASSERT_EQ(123, dl_iterate_phdr([](dl_phdr_info*, size_t, void*) { ++call_count; return 123; },
+                                 nullptr));
+  ASSERT_EQ(1u, call_count);
+}
+
+TEST(link, dl_iterate_phdr) {
+  struct Functor {
+    static int Callback(dl_phdr_info* i, size_t s, void* data) {
+      reinterpret_cast<Functor*>(data)->DoChecks(i, s);
+      return 0;
+    }
+    void DoChecks(dl_phdr_info* info, size_t s) {
+      ASSERT_EQ(sizeof(dl_phdr_info), s);
+
+      // TODO: why does the entry for the main executable have a null dlpi_addr and no name anyway?
+      if (++count == 1 && info->dlpi_addr == 0) return;
+
+      ASSERT_TRUE(info->dlpi_name != nullptr);
+
+      // Find the first PT_LOAD program header so we can find the ELF header.
+      for (ElfW(Half) i = 0; i < info->dlpi_phnum; ++i) {
+        const ElfW(Phdr)* phdr = reinterpret_cast<const ElfW(Phdr)*>(&info->dlpi_phdr[i]);
+        if (phdr->p_type == PT_LOAD) {
+          const ElfW(Ehdr)* ehdr = reinterpret_cast<const ElfW(Ehdr)*>(info->dlpi_addr +
+                                                                       phdr->p_vaddr);
+          // Does it look like an ELF file?
+          ASSERT_EQ(0, memcmp(ehdr, ELFMAG, SELFMAG));
+          // Does the e_phnum match what dl_iterate_phdr told us?
+          ASSERT_EQ(info->dlpi_phnum, ehdr->e_phnum);
+          break;
+        }
+      }
+    }
+    size_t count;
+  } f = {};
+  ASSERT_EQ(0, dl_iterate_phdr(Functor::Callback, &f));
+}
+
+#if __arm__
+static uintptr_t read_exidx_func(uintptr_t* entry) {
+  int32_t offset = *entry;
+  // Sign-extend from int31 to int32.
+  if ((offset & 0x40000000) != 0) {
+    offset += -0x7fffffff - 1;
+  }
+  return reinterpret_cast<uintptr_t>(entry) + offset;
+}
+__attribute__((__unused__)) static void another_function_in_same_ELF_file() {}
+#endif
+
+TEST(link, dl_unwind_find_exidx) {
+#if __arm__
+  int count = 0;
+  struct eit_entry_t {
+    uintptr_t one;
+    uintptr_t two;
+  };
+  eit_entry_t* entries = reinterpret_cast<eit_entry_t*>(dl_unwind_find_exidx(
+      reinterpret_cast<_Unwind_Ptr>(read_exidx_func), &count));
+  ASSERT_TRUE(entries != nullptr);
+  ASSERT_GT(count, 0);
+
+  // Sanity checks
+  uintptr_t func = reinterpret_cast<uintptr_t>(read_exidx_func);
+  bool found = false;
+  for (int i = 0; i < count; ++i) {
+    // Entries must have bit 31 clear.
+    ASSERT_TRUE((entries[i].one & (1<<31)) == 0);
+
+    uintptr_t exidx_func = read_exidx_func(&entries[i].one);
+
+    // If our function is compiled for thumb, exception table contains our address - 1.
+    if (func == exidx_func || func == exidx_func + 1) found = true;
+
+    // Entries must be sorted. Some addresses may appear twice if function
+    // is compiled for arm.
+    if (i > 0) {
+      EXPECT_GE(exidx_func, read_exidx_func(&entries[i - 1].one)) << i;
+    }
+  }
+  ASSERT_TRUE(found);
+#else
+  GTEST_LOG_(INFO) << "dl_unwind_find_exidx is an ARM-only API\n";
+#endif
+}
