xref: /aosp_15_r20/art/libartbase/base/globals_unix.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h>
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <dlfcn.h>
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker #include "globals.h"
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker namespace art {
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker #ifndef ART_STATIC_LIBARTBASE
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker #ifdef __APPLE__
28*795d594fSAndroid Build Coastguard Worker // dlopen(3) on Linux with just an SO name will search the already
29*795d594fSAndroid Build Coastguard Worker // opened libraries. On Darwin, we need dlopen(3) needs the SO name
30*795d594fSAndroid Build Coastguard Worker // qualified with it's path (if the SO is not on the search path). Use
31*795d594fSAndroid Build Coastguard Worker // linker path when compiling app. See man pages for dlopen(3) and
32*795d594fSAndroid Build Coastguard Worker // dlyd(1).
33*795d594fSAndroid Build Coastguard Worker   static constexpr const char kLibArtBaseDebug[] = "@rpath/libartbased.dylib";
34*795d594fSAndroid Build Coastguard Worker   static constexpr const char kLibArtBaseRelease[] = "@rpath/libartbase.dylib";
35*795d594fSAndroid Build Coastguard Worker #else
36*795d594fSAndroid Build Coastguard Worker   static constexpr const char kLibArtBaseDebug[] = "libartbased.so";
37*795d594fSAndroid Build Coastguard Worker   static constexpr const char kLibArtBaseRelease[] = "libartbase.so";
38*795d594fSAndroid Build Coastguard Worker #endif  // __APPLE__
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker // Check that we have not loaded both debug and release version of libartbase at the same time.
41*795d594fSAndroid Build Coastguard Worker //
42*795d594fSAndroid Build Coastguard Worker // This can be a cascade problem originating from a call to
43*795d594fSAndroid Build Coastguard Worker // LoadLibdexfileExternal in libdexfile_support: If it was called before any ART
44*795d594fSAndroid Build Coastguard Worker // libraries were loaded it will default to the non-debug version, which can
45*795d594fSAndroid Build Coastguard Worker // then clash with a later load of the debug version.
46*795d594fSAndroid Build Coastguard Worker static struct CheckLoadedBuild {
CheckLoadedBuildart::CheckLoadedBuild47*795d594fSAndroid Build Coastguard Worker   CheckLoadedBuild() {
48*795d594fSAndroid Build Coastguard Worker     bool debug_build_loaded = (dlopen(kLibArtBaseDebug, RTLD_NOW | RTLD_NOLOAD) != nullptr);
49*795d594fSAndroid Build Coastguard Worker     bool release_build_loaded = (dlopen(kLibArtBaseRelease, RTLD_NOW | RTLD_NOLOAD) != nullptr);
50*795d594fSAndroid Build Coastguard Worker     // TODO: The exit calls below are needed as CHECK would cause recursive backtracing. Fix it.
51*795d594fSAndroid Build Coastguard Worker     if (!(debug_build_loaded || release_build_loaded)) {
52*795d594fSAndroid Build Coastguard Worker       LOG(FATAL_WITHOUT_ABORT) << "Failed to dlopen "
53*795d594fSAndroid Build Coastguard Worker                                << kLibArtBaseDebug
54*795d594fSAndroid Build Coastguard Worker                                << " or "
55*795d594fSAndroid Build Coastguard Worker                                << kLibArtBaseRelease;
56*795d594fSAndroid Build Coastguard Worker       exit(1);
57*795d594fSAndroid Build Coastguard Worker     }
58*795d594fSAndroid Build Coastguard Worker     if (kIsDebugBuild && release_build_loaded) {
59*795d594fSAndroid Build Coastguard Worker       LOG(FATAL_WITHOUT_ABORT) << "Loading "
60*795d594fSAndroid Build Coastguard Worker                                << kLibArtBaseDebug
61*795d594fSAndroid Build Coastguard Worker                                << " while "
62*795d594fSAndroid Build Coastguard Worker                                << kLibArtBaseRelease
63*795d594fSAndroid Build Coastguard Worker                                << " is already loaded";
64*795d594fSAndroid Build Coastguard Worker       exit(1);
65*795d594fSAndroid Build Coastguard Worker     }
66*795d594fSAndroid Build Coastguard Worker     if (!kIsDebugBuild && debug_build_loaded) {
67*795d594fSAndroid Build Coastguard Worker       LOG(FATAL_WITHOUT_ABORT) << "Loading "
68*795d594fSAndroid Build Coastguard Worker                                << kLibArtBaseRelease
69*795d594fSAndroid Build Coastguard Worker                                << " while "
70*795d594fSAndroid Build Coastguard Worker                                << kLibArtBaseDebug
71*795d594fSAndroid Build Coastguard Worker                                << " is already loaded";
72*795d594fSAndroid Build Coastguard Worker       exit(1);
73*795d594fSAndroid Build Coastguard Worker     }
74*795d594fSAndroid Build Coastguard Worker   }
75*795d594fSAndroid Build Coastguard Worker } g_check_loaded_build;
76*795d594fSAndroid Build Coastguard Worker 
77*795d594fSAndroid Build Coastguard Worker #endif  // !ART_STATIC_LIBARTBASE
78*795d594fSAndroid Build Coastguard Worker 
79*795d594fSAndroid Build Coastguard Worker }  // namespace art
80