Fix double loading check for Darwin

Rename globals.cc to globals_unix.cc and fix-up in the blueprint file.

This fixes the build failure on Mac when running (hiddenapi) due to the
double library loading check.

Test: make -j12 PRODUCT-sdk-sdk sdk_repo (completes on OS X)
Bug: 132163727

(cherry picked from commit 6a3c67e534313e0bc69ff5cd71e7197cefece9fb)

Merged-In: I5b7392ac94398ac00c1e703895c639f0e6469141
Change-Id: I5b7392ac94398ac00c1e703895c639f0e6469141
diff --git a/libartbase/Android.bp b/libartbase/Android.bp
index 339d3c2..1611426 100644
--- a/libartbase/Android.bp
+++ b/libartbase/Android.bp
@@ -27,7 +27,6 @@
         "base/enums.cc",
         "base/file_magic.cc",
         "base/file_utils.cc",
-        "base/globals.cc",
         "base/hex_dump.cc",
         "base/hiddenapi_flags.cc",
         "base/logging.cc",
@@ -74,6 +73,7 @@
         },
         not_windows: {
             srcs: [
+                "base/globals_unix.cc",
                 "base/mem_map_unix.cc",
             ],
             shared_libs: [
diff --git a/libartbase/base/globals.cc b/libartbase/base/globals.cc
deleted file mode 100644
index ba064b5..0000000
--- a/libartbase/base/globals.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <android-base/logging.h>
-
-#if !defined(_WIN32)
-#include <dlfcn.h>
-#endif
-
-#include "globals.h"
-
-namespace art {
-
-#if !defined(_WIN32) && !defined(__APPLE__)
-// Check that we have not loaded both debug and release version of libartbase at the same time.
-//
-// This can be a cascade problem originating from a call to
-// LoadLibdexfileExternal in libdexfile_support: If it was called before any ART
-// libraries were loaded it will default to the non-debug version, which can
-// then clash with a later load of the debug version.
-static struct CheckLoadedBuild {
-  CheckLoadedBuild() {
-    bool debug_build_loaded = (dlopen("libartbased.so", RTLD_NOW | RTLD_NOLOAD) != nullptr);
-    bool release_build_loaded = (dlopen("libartbase.so", RTLD_NOW | RTLD_NOLOAD) != nullptr);
-    // TODO: The exit calls below are needed as CHECK would cause recursive backtracing. Fix it.
-    if (!debug_build_loaded && !release_build_loaded) {
-      LOG(FATAL_WITHOUT_ABORT) << "Failed to dlopen libartbase.so or libartbased.so";
-      exit(1);
-    }
-    if (kIsDebugBuild && release_build_loaded) {
-      LOG(FATAL_WITHOUT_ABORT) << "Loading libartbased.so while libartbase.so is already loaded";
-      exit(1);
-    }
-    if (!kIsDebugBuild && debug_build_loaded) {
-      LOG(FATAL_WITHOUT_ABORT) << "Loading libartbase.so while libartbased.so is already loaded";
-      exit(1);
-    }
-  }
-} g_check_loaded_build;
-#endif
-
-}  // namespace art
diff --git a/libartbase/base/globals_unix.cc b/libartbase/base/globals_unix.cc
new file mode 100644
index 0000000..0d2e8a9
--- /dev/null
+++ b/libartbase/base/globals_unix.cc
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+
+#include <dlfcn.h>
+
+#include "globals.h"
+
+namespace art {
+
+#ifdef __APPLE__
+// dlopen(3) on Linux with just an SO name will search the already
+// opened libraries. On Darwin, we need dlopen(3) needs the SO name
+// qualified with it's path (if the SO is not on the search path). Use
+// linker path when compiling app. See man pages for dlopen(3) and
+// dlyd(1).
+  static constexpr const char kLibArtBaseDebug[] = "@rpath/libartbased.dylib";
+  static constexpr const char kLibArtBaseRelease[] = "@rpath/libartbase.dylib";
+#else
+  static constexpr const char kLibArtBaseDebug[] = "libartbased.so";
+  static constexpr const char kLibArtBaseRelease[] = "libartbase.so";
+#endif  // __APPLE__
+
+// Check that we have not loaded both debug and release version of libartbase at the same time.
+//
+// This can be a cascade problem originating from a call to
+// LoadLibdexfileExternal in libdexfile_support: If it was called before any ART
+// libraries were loaded it will default to the non-debug version, which can
+// then clash with a later load of the debug version.
+static struct CheckLoadedBuild {
+  CheckLoadedBuild() {
+    bool debug_build_loaded = (dlopen(kLibArtBaseDebug, RTLD_NOW | RTLD_NOLOAD) != nullptr);
+    bool release_build_loaded = (dlopen(kLibArtBaseRelease, RTLD_NOW | RTLD_NOLOAD) != nullptr);
+    // TODO: The exit calls below are needed as CHECK would cause recursive backtracing. Fix it.
+    if (!(debug_build_loaded || release_build_loaded)) {
+      LOG(FATAL_WITHOUT_ABORT) << "Failed to dlopen "
+                               << kLibArtBaseDebug
+                               << " or "
+                               << kLibArtBaseRelease;
+      exit(1);
+    }
+    if (kIsDebugBuild && release_build_loaded) {
+      LOG(FATAL_WITHOUT_ABORT) << "Loading "
+                               << kLibArtBaseDebug
+                               << " while "
+                               << kLibArtBaseRelease
+                               << " is already loaded";
+      exit(1);
+    }
+    if (!kIsDebugBuild && debug_build_loaded) {
+      LOG(FATAL_WITHOUT_ABORT) << "Loading "
+                               << kLibArtBaseRelease
+                               << " while "
+                               << kLibArtBaseDebug
+                               << " is already loaded";
+      exit(1);
+    }
+  }
+} g_check_loaded_build;
+
+}  // namespace art