Merge "Remove __ANDROID_NDK__ from bionic, and document our #defines."
diff --git a/libc/Android.bp b/libc/Android.bp
index 37e0f09..3e2ee1d 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -1525,6 +1525,22 @@
     ],
 }
 
+// Versions of dl_iterate_phdr and similar APIs used to lookup unwinding information in a static
+// executable.
+cc_library_static {
+    name: "libc_unwind_static",
+    defaults: ["libc_defaults"],
+    cflags: ["-DLIBC_STATIC"],
+
+    srcs: ["bionic/dl_iterate_phdr_static.cpp"],
+    arch: {
+        // arm32-specific dl_unwind_find_exidx and __gnu_Unwind_Find_exidx APIs
+        arm: {
+            srcs: ["arch-arm/bionic/exidx_static.c"],
+        },
+    },
+}
+
 // ========================================================
 // libc_nomalloc.a
 // ========================================================
@@ -1537,20 +1553,13 @@
 
 cc_library_static {
     name: "libc_nomalloc",
-
     defaults: ["libc_defaults"],
-
-    arch: {
-        arm: {
-            srcs: ["arch-arm/bionic/exidx_static.c"],
-        },
-    },
-
     cflags: ["-DLIBC_STATIC"],
 
     whole_static_libs: [
         "libc_common_static",
         "libc_init_static",
+        "libc_unwind_static",
     ],
 }
 
@@ -1572,7 +1581,6 @@
 filegroup {
     name: "libc_sources_static",
     srcs: [
-        "bionic/dl_iterate_phdr_static.cpp",
         "bionic/malloc_common.cpp",
         "bionic/malloc_limit.cpp",
     ],
@@ -1586,11 +1594,6 @@
     ],
 }
 
-filegroup {
-    name: "libc_sources_static_arm",
-    srcs: [ "arch-arm/bionic/exidx_static.c" ],
-}
-
 // ========================================================
 // libc.a + libc.so
 // ========================================================
@@ -1613,6 +1616,7 @@
         whole_static_libs: [
             "libc_init_static",
             "libc_common_static",
+            "libc_unwind_static",
         ],
     },
     shared: {
@@ -1662,9 +1666,6 @@
                 // special for arm
                 cflags: ["-DCRT_LEGACY_WORKAROUND"],
             },
-            static: {
-                srcs: [":libc_sources_static_arm"],
-            },
 
             // Arm 32 bit does not produce complete exidx unwind information
             // so keep the .debug_frame which is relatively small and does
diff --git a/libc/arch-arm/bionic/exidx_static.c b/libc/arch-arm/bionic/exidx_static.c
index ef3745f..9830c54 100644
--- a/libc/arch-arm/bionic/exidx_static.c
+++ b/libc/arch-arm/bionic/exidx_static.c
@@ -43,7 +43,11 @@
 extern struct exidx_entry __exidx_end;
 extern struct exidx_entry __exidx_start;
 
-_Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc __attribute__((unused)), int* pcount) {
+_Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc __attribute__((unused)), int* pcount) {
   *pcount = (&__exidx_end - &__exidx_start);
   return (_Unwind_Ptr)&__exidx_start;
 }
+
+_Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc, int *pcount) {
+  return dl_unwind_find_exidx(pc, pcount);
+}
diff --git a/libc/malloc_debug/Android.bp b/libc/malloc_debug/Android.bp
index ce80a97..7340f95 100644
--- a/libc/malloc_debug/Android.bp
+++ b/libc/malloc_debug/Android.bp
@@ -109,9 +109,13 @@
     ],
 
     apex_available: [
-        "//apex_available:platform",
         "com.android.runtime",
     ],
+    static: {
+        apex_available: [
+            "//apex_available:platform",
+        ],
+    },
 }
 
 // ==============================================================
diff --git a/libc/malloc_hooks/Android.bp b/libc/malloc_hooks/Android.bp
index a0f8102..861c371 100644
--- a/libc/malloc_hooks/Android.bp
+++ b/libc/malloc_hooks/Android.bp
@@ -32,6 +32,15 @@
         "-Werror",
         "-fno-stack-protector",
     ],
+
+    apex_available: [
+        "com.android.runtime",
+    ],
+    static: {
+        apex_available: [
+            "//apex_available:platform",
+        ],
+    },
 }
 
 // ==============================================================
diff --git a/libdl/libdl_static.cpp b/libdl/libdl_static.cpp
index 0a36e6f..3bbf963 100644
--- a/libdl/libdl_static.cpp
+++ b/libdl/libdl_static.cpp
@@ -41,9 +41,3 @@
 int dlclose(void* /*handle*/) {
   return -1;
 }
-
-#if defined(__arm__)
-_Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr /*pc*/, int* /*pcount*/) {
-  return 0;
-}
-#endif
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 37a3189..cee9c3b 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -4208,7 +4208,7 @@
   if (insert_pos == std::string::npos) {
     insert_pos = ld_config_file_vndk.length();
   }
-  ld_config_file_vndk.insert(insert_pos, Config::get_vndk_version_string('.'));
+  ld_config_file_vndk.insert(insert_pos, Config::get_vndk_version_string("."));
   return ld_config_file_vndk;
 }
 
diff --git a/linker/linker_config.cpp b/linker/linker_config.cpp
index 46c91a3..450d0e6 100644
--- a/linker/linker_config.cpp
+++ b/linker/linker_config.cpp
@@ -408,7 +408,7 @@
       params.push_back({ "SDK_VER", buf });
     }
 
-    static std::string vndk = Config::get_vndk_version_string('-');
+    static std::string vndk = Config::get_vndk_version_string("");
     params.push_back({ "VNDK_VER", vndk });
 
     for (auto& path : paths) {
@@ -596,11 +596,11 @@
   return true;
 }
 
-std::string Config::get_vndk_version_string(const char delimiter) {
+std::string Config::get_vndk_version_string(const std::string& prefix) {
   std::string version = android::base::GetProperty("ro.vndk.version", "");
   if (version != "" && version != "current") {
-    //add the delimiter char in front of the string and return it.
-    return version.insert(0, 1, delimiter);
+    //add the prefix in front of the string and return it.
+    return version.insert(0, prefix);
   }
   return "";
 }
diff --git a/linker/linker_config.h b/linker/linker_config.h
index 75d9378..547c62e 100644
--- a/linker/linker_config.h
+++ b/linker/linker_config.h
@@ -164,7 +164,7 @@
                                  const Config** config,
                                  std::string* error_msg);
 
-  static std::string get_vndk_version_string(const char delimiter);
+  static std::string get_vndk_version_string(const std::string& prefix);
  private:
   void clear();