xref: /aosp_15_r20/system/linkerconfig/contents/namespace/vndk.cc (revision e5eeaa8e05bc25a862c0c861bda7c8a6bfb42dad)
1*e5eeaa8eSAndroid Build Coastguard Worker /*
2*e5eeaa8eSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*e5eeaa8eSAndroid Build Coastguard Worker  *
4*e5eeaa8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e5eeaa8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e5eeaa8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e5eeaa8eSAndroid Build Coastguard Worker  *
8*e5eeaa8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e5eeaa8eSAndroid Build Coastguard Worker  *
10*e5eeaa8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e5eeaa8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e5eeaa8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e5eeaa8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e5eeaa8eSAndroid Build Coastguard Worker  * limitations under the License.
15*e5eeaa8eSAndroid Build Coastguard Worker  */
16*e5eeaa8eSAndroid Build Coastguard Worker 
17*e5eeaa8eSAndroid Build Coastguard Worker // This namespace is exclusively for vndk-sp libs.
18*e5eeaa8eSAndroid Build Coastguard Worker 
19*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/environment.h"
20*e5eeaa8eSAndroid Build Coastguard Worker 
21*e5eeaa8eSAndroid Build Coastguard Worker #include <android-base/strings.h>
22*e5eeaa8eSAndroid Build Coastguard Worker 
23*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/namespacebuilder.h"
24*e5eeaa8eSAndroid Build Coastguard Worker 
25*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::Namespace;
26*e5eeaa8eSAndroid Build Coastguard Worker 
27*e5eeaa8eSAndroid Build Coastguard Worker namespace android {
28*e5eeaa8eSAndroid Build Coastguard Worker namespace linkerconfig {
29*e5eeaa8eSAndroid Build Coastguard Worker namespace contents {
BuildVndkNamespace(const Context & ctx,VndkUserPartition vndk_user)30*e5eeaa8eSAndroid Build Coastguard Worker Namespace BuildVndkNamespace([[maybe_unused]] const Context& ctx,
31*e5eeaa8eSAndroid Build Coastguard Worker                              VndkUserPartition vndk_user) {
32*e5eeaa8eSAndroid Build Coastguard Worker   bool is_system_or_unrestricted_section = ctx.IsSystemSection() ||
33*e5eeaa8eSAndroid Build Coastguard Worker                                            ctx.IsUnrestrictedSection();
34*e5eeaa8eSAndroid Build Coastguard Worker   if (ctx.IsApexBinaryConfig()) {
35*e5eeaa8eSAndroid Build Coastguard Worker     is_system_or_unrestricted_section = ctx.GetCurrentApex().InSystem();
36*e5eeaa8eSAndroid Build Coastguard Worker   }
37*e5eeaa8eSAndroid Build Coastguard Worker   // In the system section, we need to have an additional vndk namespace for
38*e5eeaa8eSAndroid Build Coastguard Worker   // product apps. We must have a different name "vndk_product" for this
39*e5eeaa8eSAndroid Build Coastguard Worker   // namespace. "vndk_product" namespace is used only from the native_loader for
40*e5eeaa8eSAndroid Build Coastguard Worker   // product apps.
41*e5eeaa8eSAndroid Build Coastguard Worker   const char* name;
42*e5eeaa8eSAndroid Build Coastguard Worker   if (is_system_or_unrestricted_section &&
43*e5eeaa8eSAndroid Build Coastguard Worker       vndk_user == VndkUserPartition::Product) {
44*e5eeaa8eSAndroid Build Coastguard Worker     name = "vndk_product";
45*e5eeaa8eSAndroid Build Coastguard Worker   } else {
46*e5eeaa8eSAndroid Build Coastguard Worker     name = "vndk";
47*e5eeaa8eSAndroid Build Coastguard Worker   }
48*e5eeaa8eSAndroid Build Coastguard Worker 
49*e5eeaa8eSAndroid Build Coastguard Worker   // Isolated and visible when used in the [system] or [unrestricted] section to
50*e5eeaa8eSAndroid Build Coastguard Worker   // allow links to be created at runtime, e.g. through android_link_namespaces
51*e5eeaa8eSAndroid Build Coastguard Worker   // in libnativeloader. Otherwise namespace should be isolated but not visible
52*e5eeaa8eSAndroid Build Coastguard Worker   // so namespace itself keep strict and links would not be modified at runtime.
53*e5eeaa8eSAndroid Build Coastguard Worker   Namespace ns(name,
54*e5eeaa8eSAndroid Build Coastguard Worker                /*is_isolated=*/true,
55*e5eeaa8eSAndroid Build Coastguard Worker                /*is_visible=*/is_system_or_unrestricted_section);
56*e5eeaa8eSAndroid Build Coastguard Worker 
57*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<std::string> lib_paths;
58*e5eeaa8eSAndroid Build Coastguard Worker   std::string vndk_version;
59*e5eeaa8eSAndroid Build Coastguard Worker   if (vndk_user == VndkUserPartition::Product) {
60*e5eeaa8eSAndroid Build Coastguard Worker     lib_paths = {Var("PRODUCT") + "/${LIB}"};
61*e5eeaa8eSAndroid Build Coastguard Worker     vndk_version = Var("PRODUCT_VNDK_VERSION");
62*e5eeaa8eSAndroid Build Coastguard Worker   } else {
63*e5eeaa8eSAndroid Build Coastguard Worker     // default for vendor
64*e5eeaa8eSAndroid Build Coastguard Worker     lib_paths = {"/odm/${LIB}", "/vendor/${LIB}"};
65*e5eeaa8eSAndroid Build Coastguard Worker     vndk_version = Var("VENDOR_VNDK_VERSION");
66*e5eeaa8eSAndroid Build Coastguard Worker   }
67*e5eeaa8eSAndroid Build Coastguard Worker 
68*e5eeaa8eSAndroid Build Coastguard Worker   // Search order:
69*e5eeaa8eSAndroid Build Coastguard Worker   // 1. VNDK Extensions
70*e5eeaa8eSAndroid Build Coastguard Worker   // 2. VNDK APEX
71*e5eeaa8eSAndroid Build Coastguard Worker   // 3. vendor/lib or product/lib to allow extensions to use them
72*e5eeaa8eSAndroid Build Coastguard Worker 
73*e5eeaa8eSAndroid Build Coastguard Worker   // 1. VNDK Extensions
74*e5eeaa8eSAndroid Build Coastguard Worker   for (const auto& lib_path : lib_paths) {
75*e5eeaa8eSAndroid Build Coastguard Worker     ns.AddSearchPath(lib_path + "/vndk-sp");
76*e5eeaa8eSAndroid Build Coastguard Worker     if (!is_system_or_unrestricted_section) {
77*e5eeaa8eSAndroid Build Coastguard Worker       ns.AddSearchPath(lib_path + "/vndk");
78*e5eeaa8eSAndroid Build Coastguard Worker     }
79*e5eeaa8eSAndroid Build Coastguard Worker   }
80*e5eeaa8eSAndroid Build Coastguard Worker 
81*e5eeaa8eSAndroid Build Coastguard Worker   // 2. VNDK APEX
82*e5eeaa8eSAndroid Build Coastguard Worker   ns.AddSearchPath("/apex/com.android.vndk.v" + vndk_version + "/${LIB}");
83*e5eeaa8eSAndroid Build Coastguard Worker 
84*e5eeaa8eSAndroid Build Coastguard Worker   if (vndk_user == VndkUserPartition::Vendor) {
85*e5eeaa8eSAndroid Build Coastguard Worker     // It is for vendor sp-hal
86*e5eeaa8eSAndroid Build Coastguard Worker     ns.AddPermittedPath("/odm/${LIB}/hw");
87*e5eeaa8eSAndroid Build Coastguard Worker     ns.AddPermittedPath("/odm/${LIB}/egl");
88*e5eeaa8eSAndroid Build Coastguard Worker     ns.AddPermittedPath("/vendor/${LIB}/hw");
89*e5eeaa8eSAndroid Build Coastguard Worker     ns.AddPermittedPath("/vendor/${LIB}/egl");
90*e5eeaa8eSAndroid Build Coastguard Worker     ns.AddPermittedPath("/system/vendor/${LIB}/hw");
91*e5eeaa8eSAndroid Build Coastguard Worker     ns.AddPermittedPath("/system/vendor/${LIB}/egl");
92*e5eeaa8eSAndroid Build Coastguard Worker 
93*e5eeaa8eSAndroid Build Coastguard Worker     // This is exceptionally required since [email protected] is here
94*e5eeaa8eSAndroid Build Coastguard Worker     ns.AddPermittedPath("/apex/com.android.vndk.v" +
95*e5eeaa8eSAndroid Build Coastguard Worker                         Var("VENDOR_VNDK_VERSION") + "/${LIB}/hw");
96*e5eeaa8eSAndroid Build Coastguard Worker   }
97*e5eeaa8eSAndroid Build Coastguard Worker 
98*e5eeaa8eSAndroid Build Coastguard Worker   // 3. vendor/lib or product/lib
99*e5eeaa8eSAndroid Build Coastguard Worker   if (is_system_or_unrestricted_section || ctx.IsApexBinaryConfig()) {
100*e5eeaa8eSAndroid Build Coastguard Worker     // Add (vendor|product)/lib for cases (vendor|product) namespace does not exist.
101*e5eeaa8eSAndroid Build Coastguard Worker     for (const auto& lib_path : lib_paths) {
102*e5eeaa8eSAndroid Build Coastguard Worker       ns.AddSearchPath(lib_path);
103*e5eeaa8eSAndroid Build Coastguard Worker     }
104*e5eeaa8eSAndroid Build Coastguard Worker   } else {
105*e5eeaa8eSAndroid Build Coastguard Worker     // To avoid double loading library issue, add link to the default
106*e5eeaa8eSAndroid Build Coastguard Worker     // namespace instead of adding search path.
107*e5eeaa8eSAndroid Build Coastguard Worker     ns.GetLink("default").AllowAllSharedLibs();
108*e5eeaa8eSAndroid Build Coastguard Worker   }
109*e5eeaa8eSAndroid Build Coastguard Worker 
110*e5eeaa8eSAndroid Build Coastguard Worker   AddLlndkLibraries(ctx, &ns, vndk_user);
111*e5eeaa8eSAndroid Build Coastguard Worker 
112*e5eeaa8eSAndroid Build Coastguard Worker   if (ctx.IsProductSection() || ctx.IsVendorSection()) {
113*e5eeaa8eSAndroid Build Coastguard Worker     if (android::linkerconfig::modules::IsVndkInSystemNamespace()) {
114*e5eeaa8eSAndroid Build Coastguard Worker       ns.GetLink("vndk_in_system")
115*e5eeaa8eSAndroid Build Coastguard Worker           .AddSharedLib(Var("VNDK_USING_CORE_VARIANT_LIBRARIES"));
116*e5eeaa8eSAndroid Build Coastguard Worker     }
117*e5eeaa8eSAndroid Build Coastguard Worker   }
118*e5eeaa8eSAndroid Build Coastguard Worker 
119*e5eeaa8eSAndroid Build Coastguard Worker   return ns;
120*e5eeaa8eSAndroid Build Coastguard Worker }
121*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace contents
122*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace linkerconfig
123*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace android
124