1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 // Framework-side code runs in this namespace. Libs from /vendor partition can't 18 // be loaded in this namespace. 19 20 #include "linkerconfig/common.h" 21 #include "linkerconfig/environment.h" 22 #include "linkerconfig/namespace.h" 23 #include "linkerconfig/namespacebuilder.h" 24 25 using android::linkerconfig::modules::AsanPath; 26 using android::linkerconfig::modules::IsProductVndkVersionDefined; 27 using android::linkerconfig::modules::Namespace; 28 29 namespace android { 30 namespace linkerconfig { 31 namespace contents { 32 Namespace BuildSystemDefaultNamespace([[maybe_unused]] const Context& ctx) { 33 bool is_fully_treblelized = ctx.IsDefaultConfig(); 34 std::string product = Var("PRODUCT"); 35 std::string system_ext = Var("SYSTEM_EXT"); 36 37 // Visible to allow links to be created at runtime, e.g. through 38 // android_link_namespaces in libnativeloader. 39 Namespace ns("default", 40 /*is_isolated=*/is_fully_treblelized, 41 /*is_visible=*/true); 42 43 ns.AddSearchPath("/system/${LIB}", AsanPath::WITH_DATA_ASAN); 44 ns.AddSearchPath(system_ext + "/${LIB}", AsanPath::WITH_DATA_ASAN); 45 if (!IsProductVndkVersionDefined() || !is_fully_treblelized) { 46 // System processes can search product libs only if product VNDK is not 47 // enforced. 48 ns.AddSearchPath(product + "/${LIB}", AsanPath::WITH_DATA_ASAN); 49 } 50 if (!is_fully_treblelized) { 51 ns.AddSearchPath("/vendor/${LIB}", AsanPath::WITH_DATA_ASAN); 52 ns.AddSearchPath("/odm/${LIB}", AsanPath::WITH_DATA_ASAN); 53 } 54 55 if (is_fully_treblelized) { 56 // We can't have entire /system/${LIB} as permitted paths because doing so 57 // makes it possible to load libs in /system/${LIB}/vndk* directories by 58 // their absolute paths, e.g. dlopen("/system/lib/vndk/libbase.so"). VNDK 59 // libs are built with previous versions of Android and thus must not be 60 // loaded into this namespace where libs built with the current version of 61 // Android are loaded. Mixing the two types of libs in the same namespace 62 // can cause unexpected problems. 63 const std::vector<std::string> permitted_paths = { 64 "/system/${LIB}/drm", 65 "/system/${LIB}/extractors", 66 "/system/${LIB}/hw", 67 system_ext + "/${LIB}", 68 69 // These are where odex files are located. libart has to be able to 70 // dlopen the files 71 "/system/framework", 72 73 "/system/app", 74 "/system/priv-app", 75 system_ext + "/framework", 76 system_ext + "/app", 77 system_ext + "/priv-app", 78 "/vendor/framework", 79 "/vendor/app", 80 "/vendor/priv-app", 81 "/system/vendor/framework", 82 "/system/vendor/app", 83 "/system/vendor/priv-app", 84 "/odm/framework", 85 "/odm/app", 86 "/odm/priv-app", 87 "/oem/app", 88 product + "/framework", 89 product + "/app", 90 product + "/priv-app", 91 "/data", 92 "/mnt/expand", 93 "/apex/com.android.runtime/${LIB}/bionic", 94 "/system/${LIB}/bootstrap"}; 95 96 for (const auto& path : permitted_paths) { 97 ns.AddPermittedPath(path, AsanPath::SAME_PATH); 98 } 99 if (!IsProductVndkVersionDefined()) { 100 // System processes can use product libs only if product VNDK is not enforced. 101 ns.AddPermittedPath(product + "/${LIB}", AsanPath::SAME_PATH); 102 } 103 } 104 105 ns.AddRequires(std::vector{ 106 // Keep in sync with the "platform" namespace in art/build/apex/ld.config.txt. 107 "libdexfile_external.so", 108 "libdexfiled_external.so", 109 "libnativebridge.so", 110 "libnativehelper.so", 111 "libnativeloader.so", 112 "libandroidicu.so", 113 // TODO(b/122876336): Remove libpac.so once it's migrated to Webview 114 "libpac.so", 115 // TODO(b/120786417 or b/134659294): libicuuc.so 116 // and libicui18n.so are kept for app compat. 117 "libicui18n.so", 118 "libicuuc.so", 119 // resolv 120 "libnetd_resolv.so", 121 // nn 122 "libneuralnetworks.so", 123 // statsd 124 "libstatspull.so", 125 "libstatssocket.so", 126 // adbd 127 "libadb_pairing_auth.so", 128 "libadb_pairing_connection.so", 129 "libadb_pairing_server.so", 130 }); 131 132 ns.AddProvides(GetSystemStubLibraries()); 133 return ns; 134 } 135 } // namespace contents 136 } // namespace linkerconfig 137 } // namespace android 138