xref: /aosp_15_r20/system/linkerconfig/contents/section/apexdefault.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 #include "linkerconfig/namespace.h"
18*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/sectionbuilder.h"
19*e5eeaa8eSAndroid Build Coastguard Worker 
20*e5eeaa8eSAndroid Build Coastguard Worker #include <functional>
21*e5eeaa8eSAndroid Build Coastguard Worker #include <vector>
22*e5eeaa8eSAndroid Build Coastguard Worker 
23*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/common.h"
24*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/environment.h"
25*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/log.h"
26*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/namespacebuilder.h"
27*e5eeaa8eSAndroid Build Coastguard Worker #include "linkerconfig/section.h"
28*e5eeaa8eSAndroid Build Coastguard Worker 
29*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::contents::SectionType;
30*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::ApexInfo;
31*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::LibProvider;
32*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::LibProviders;
33*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::Namespace;
34*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::Section;
35*e5eeaa8eSAndroid Build Coastguard Worker using android::linkerconfig::modules::SharedLibs;
36*e5eeaa8eSAndroid Build Coastguard Worker 
37*e5eeaa8eSAndroid Build Coastguard Worker namespace android {
38*e5eeaa8eSAndroid Build Coastguard Worker namespace linkerconfig {
39*e5eeaa8eSAndroid Build Coastguard Worker namespace contents {
40*e5eeaa8eSAndroid Build Coastguard Worker 
41*e5eeaa8eSAndroid Build Coastguard Worker // Builds default section for the apex
42*e5eeaa8eSAndroid Build Coastguard Worker // For com.android.foo,
43*e5eeaa8eSAndroid Build Coastguard Worker //   dir.com.android.foo = /apex/com.android.foo/bin
44*e5eeaa8eSAndroid Build Coastguard Worker //   [com.android.foo]
45*e5eeaa8eSAndroid Build Coastguard Worker //   additional.namespaces = system
46*e5eeaa8eSAndroid Build Coastguard Worker //   namespace.default....
47*e5eeaa8eSAndroid Build Coastguard Worker //   namespace.system...
BuildApexDefaultSection(Context & ctx,const ApexInfo & apex_info)48*e5eeaa8eSAndroid Build Coastguard Worker Section BuildApexDefaultSection(Context& ctx, const ApexInfo& apex_info) {
49*e5eeaa8eSAndroid Build Coastguard Worker   ctx.SetCurrentSection(SectionType::Other);
50*e5eeaa8eSAndroid Build Coastguard Worker 
51*e5eeaa8eSAndroid Build Coastguard Worker   bool target_apex_visible = apex_info.visible;
52*e5eeaa8eSAndroid Build Coastguard Worker   std::set<std::string> visible_apexes;
53*e5eeaa8eSAndroid Build Coastguard Worker   if (apex_info.name == "com.android.art") {
54*e5eeaa8eSAndroid Build Coastguard Worker     // ld.config.txt for the ART module needs to have the namespaces with public
55*e5eeaa8eSAndroid Build Coastguard Worker     // and JNI libs visible since it runs dalvikvm and hence libnativeloader,
56*e5eeaa8eSAndroid Build Coastguard Worker     // which builds classloader namespaces that may link to those libs.
57*e5eeaa8eSAndroid Build Coastguard Worker     for (const auto& apex : ctx.GetApexModules()) {
58*e5eeaa8eSAndroid Build Coastguard Worker       if (apex.jni_libs.size() > 0 || apex.public_libs.size() > 0) {
59*e5eeaa8eSAndroid Build Coastguard Worker         visible_apexes.insert(apex.name);
60*e5eeaa8eSAndroid Build Coastguard Worker         if (apex.name == apex_info.name) {
61*e5eeaa8eSAndroid Build Coastguard Worker           target_apex_visible = true;
62*e5eeaa8eSAndroid Build Coastguard Worker         }
63*e5eeaa8eSAndroid Build Coastguard Worker       }
64*e5eeaa8eSAndroid Build Coastguard Worker     }
65*e5eeaa8eSAndroid Build Coastguard Worker   }
66*e5eeaa8eSAndroid Build Coastguard Worker 
67*e5eeaa8eSAndroid Build Coastguard Worker   std::vector<Namespace> namespaces;
68*e5eeaa8eSAndroid Build Coastguard Worker 
69*e5eeaa8eSAndroid Build Coastguard Worker   // If target APEX should be visible, then there will be two namespaces -
70*e5eeaa8eSAndroid Build Coastguard Worker   // default and APEX namespace - with same set of libraries. To avoid any
71*e5eeaa8eSAndroid Build Coastguard Worker   // confusion based on two same namespaces, and also to avoid loading same
72*e5eeaa8eSAndroid Build Coastguard Worker   // library twice based on the namespace, use empty default namespace which
73*e5eeaa8eSAndroid Build Coastguard Worker   // does not contain any search path and fully links to visible APEX namespace.
74*e5eeaa8eSAndroid Build Coastguard Worker   if (target_apex_visible) {
75*e5eeaa8eSAndroid Build Coastguard Worker     namespaces.emplace_back(BuildApexEmptyDefaultNamespace(ctx, apex_info));
76*e5eeaa8eSAndroid Build Coastguard Worker   } else {
77*e5eeaa8eSAndroid Build Coastguard Worker     namespaces.emplace_back(BuildApexDefaultNamespace(ctx, apex_info));
78*e5eeaa8eSAndroid Build Coastguard Worker   }
79*e5eeaa8eSAndroid Build Coastguard Worker   namespaces.emplace_back(BuildApexPlatformNamespace(ctx));
80*e5eeaa8eSAndroid Build Coastguard Worker 
81*e5eeaa8eSAndroid Build Coastguard Worker   // Vendor APEXes can use libs provided by "vendor"
82*e5eeaa8eSAndroid Build Coastguard Worker   // and Product APEXes can use libs provided by "product"
83*e5eeaa8eSAndroid Build Coastguard Worker   if (android::linkerconfig::modules::IsTreblelizedDevice()) {
84*e5eeaa8eSAndroid Build Coastguard Worker     if (apex_info.InVendor()) {
85*e5eeaa8eSAndroid Build Coastguard Worker       namespaces.emplace_back(BuildRsNamespace(ctx));
86*e5eeaa8eSAndroid Build Coastguard Worker       auto vendor = BuildVendorNamespace(ctx, "vendor");
87*e5eeaa8eSAndroid Build Coastguard Worker       if (!vendor.GetProvides().empty()) {
88*e5eeaa8eSAndroid Build Coastguard Worker         namespaces.emplace_back(std::move(vendor));
89*e5eeaa8eSAndroid Build Coastguard Worker       }
90*e5eeaa8eSAndroid Build Coastguard Worker       if (android::linkerconfig::modules::IsVendorVndkVersionDefined()) {
91*e5eeaa8eSAndroid Build Coastguard Worker         namespaces.emplace_back(
92*e5eeaa8eSAndroid Build Coastguard Worker             BuildVndkNamespace(ctx, VndkUserPartition::Vendor));
93*e5eeaa8eSAndroid Build Coastguard Worker         if (android::linkerconfig::modules::IsVndkInSystemNamespace()) {
94*e5eeaa8eSAndroid Build Coastguard Worker           namespaces.emplace_back(BuildVndkInSystemNamespace(ctx));
95*e5eeaa8eSAndroid Build Coastguard Worker         }
96*e5eeaa8eSAndroid Build Coastguard Worker       }
97*e5eeaa8eSAndroid Build Coastguard Worker     } else if (apex_info.InProduct()) {
98*e5eeaa8eSAndroid Build Coastguard Worker       auto product = BuildProductNamespace(ctx, "product");
99*e5eeaa8eSAndroid Build Coastguard Worker       if (!product.GetProvides().empty()) {
100*e5eeaa8eSAndroid Build Coastguard Worker         namespaces.emplace_back(std::move(product));
101*e5eeaa8eSAndroid Build Coastguard Worker       }
102*e5eeaa8eSAndroid Build Coastguard Worker       if (android::linkerconfig::modules::IsProductVndkVersionDefined()) {
103*e5eeaa8eSAndroid Build Coastguard Worker         namespaces.emplace_back(
104*e5eeaa8eSAndroid Build Coastguard Worker             BuildVndkNamespace(ctx, VndkUserPartition::Product));
105*e5eeaa8eSAndroid Build Coastguard Worker         if (android::linkerconfig::modules::IsVndkInSystemNamespace()) {
106*e5eeaa8eSAndroid Build Coastguard Worker           namespaces.emplace_back(BuildVndkInSystemNamespace(ctx));
107*e5eeaa8eSAndroid Build Coastguard Worker         }
108*e5eeaa8eSAndroid Build Coastguard Worker       }
109*e5eeaa8eSAndroid Build Coastguard Worker     }
110*e5eeaa8eSAndroid Build Coastguard Worker   }
111*e5eeaa8eSAndroid Build Coastguard Worker 
112*e5eeaa8eSAndroid Build Coastguard Worker   LibProviders libs_providers;
113*e5eeaa8eSAndroid Build Coastguard Worker   if (apex_info.InVendor()) {
114*e5eeaa8eSAndroid Build Coastguard Worker     // In Vendor APEX, sphal namespace is not required and possible to cause
115*e5eeaa8eSAndroid Build Coastguard Worker     // same library being loaded from two namespaces (sphal and vendor). As
116*e5eeaa8eSAndroid Build Coastguard Worker     // SPHAL itself is not required from vendor (APEX) section, add vendor
117*e5eeaa8eSAndroid Build Coastguard Worker     // namespace instead.
118*e5eeaa8eSAndroid Build Coastguard Worker     libs_providers[":sphal"] = {LibProvider{
119*e5eeaa8eSAndroid Build Coastguard Worker         "vendor",
120*e5eeaa8eSAndroid Build Coastguard Worker         std::bind(BuildVendorNamespace, ctx, "vendor"),
121*e5eeaa8eSAndroid Build Coastguard Worker         SharedLibs{{}},
122*e5eeaa8eSAndroid Build Coastguard Worker     }};
123*e5eeaa8eSAndroid Build Coastguard Worker   } else {
124*e5eeaa8eSAndroid Build Coastguard Worker     libs_providers[":sphal"] = {LibProvider{
125*e5eeaa8eSAndroid Build Coastguard Worker         "sphal",
126*e5eeaa8eSAndroid Build Coastguard Worker         std::bind(BuildSphalNamespace, ctx),
127*e5eeaa8eSAndroid Build Coastguard Worker         SharedLibs{{}},
128*e5eeaa8eSAndroid Build Coastguard Worker     }};
129*e5eeaa8eSAndroid Build Coastguard Worker   }
130*e5eeaa8eSAndroid Build Coastguard Worker 
131*e5eeaa8eSAndroid Build Coastguard Worker   bool in_vendor_with_vndk_enabled =
132*e5eeaa8eSAndroid Build Coastguard Worker       !apex_info.InProduct() &&
133*e5eeaa8eSAndroid Build Coastguard Worker       android::linkerconfig::modules::IsVendorVndkVersionDefined();
134*e5eeaa8eSAndroid Build Coastguard Worker   bool in_product_with_vndk_enabled =
135*e5eeaa8eSAndroid Build Coastguard Worker       apex_info.InProduct() &&
136*e5eeaa8eSAndroid Build Coastguard Worker       android::linkerconfig::modules::IsProductVndkVersionDefined();
137*e5eeaa8eSAndroid Build Coastguard Worker 
138*e5eeaa8eSAndroid Build Coastguard Worker   if (in_vendor_with_vndk_enabled || in_product_with_vndk_enabled) {
139*e5eeaa8eSAndroid Build Coastguard Worker     VndkUserPartition user_partition = VndkUserPartition::Vendor;
140*e5eeaa8eSAndroid Build Coastguard Worker     std::string user_partition_suffix = "VENDOR";
141*e5eeaa8eSAndroid Build Coastguard Worker     if (apex_info.InProduct()) {
142*e5eeaa8eSAndroid Build Coastguard Worker       user_partition = VndkUserPartition::Product;
143*e5eeaa8eSAndroid Build Coastguard Worker       user_partition_suffix = "PRODUCT";
144*e5eeaa8eSAndroid Build Coastguard Worker     }
145*e5eeaa8eSAndroid Build Coastguard Worker     libs_providers[":sanitizer"] = {LibProvider{
146*e5eeaa8eSAndroid Build Coastguard Worker         ctx.GetSystemNamespaceName(),
147*e5eeaa8eSAndroid Build Coastguard Worker         std::bind(BuildApexPlatformNamespace,
148*e5eeaa8eSAndroid Build Coastguard Worker                   ctx),  // "system" should be available
149*e5eeaa8eSAndroid Build Coastguard Worker         SharedLibs{{Var("SANITIZER_DEFAULT_" + user_partition_suffix)}},
150*e5eeaa8eSAndroid Build Coastguard Worker     }};
151*e5eeaa8eSAndroid Build Coastguard Worker     libs_providers[":vndk"] = GetVndkProvider(ctx, user_partition);
152*e5eeaa8eSAndroid Build Coastguard Worker     libs_providers[":vndksp"] = {LibProvider{
153*e5eeaa8eSAndroid Build Coastguard Worker         "vndk",
154*e5eeaa8eSAndroid Build Coastguard Worker         std::bind(BuildVndkNamespace, ctx, user_partition),
155*e5eeaa8eSAndroid Build Coastguard Worker         SharedLibs{{Var("VNDK_SAMEPROCESS_LIBRARIES_" + user_partition_suffix)}},
156*e5eeaa8eSAndroid Build Coastguard Worker     }};
157*e5eeaa8eSAndroid Build Coastguard Worker   } else if (apex_info.InProduct() || apex_info.InVendor()) {
158*e5eeaa8eSAndroid Build Coastguard Worker     // vendor or product partitions don't need this because they link LLNDK
159*e5eeaa8eSAndroid Build Coastguard Worker     // libs. however, vendor/product apexes still need to link LLNDK sanitizer
160*e5eeaa8eSAndroid Build Coastguard Worker     // libs even though these are not listed in "required".
161*e5eeaa8eSAndroid Build Coastguard Worker     libs_providers[":sanitizer"] = {LibProvider{
162*e5eeaa8eSAndroid Build Coastguard Worker         ctx.GetSystemNamespaceName(),
163*e5eeaa8eSAndroid Build Coastguard Worker         std::bind(BuildApexPlatformNamespace,
164*e5eeaa8eSAndroid Build Coastguard Worker                   ctx),  // "system" should be available
165*e5eeaa8eSAndroid Build Coastguard Worker         SharedLibs{{Var("SANITIZER_LIBRARIES_LLNDK")}},
166*e5eeaa8eSAndroid Build Coastguard Worker     }};
167*e5eeaa8eSAndroid Build Coastguard Worker   }
168*e5eeaa8eSAndroid Build Coastguard Worker 
169*e5eeaa8eSAndroid Build Coastguard Worker   if (apex_info.InVendor()) {
170*e5eeaa8eSAndroid Build Coastguard Worker     AddVendorSubdirNamespaceProviders(ctx, libs_providers);
171*e5eeaa8eSAndroid Build Coastguard Worker   }
172*e5eeaa8eSAndroid Build Coastguard Worker 
173*e5eeaa8eSAndroid Build Coastguard Worker   return BuildSection(
174*e5eeaa8eSAndroid Build Coastguard Worker       ctx, apex_info.name, std::move(namespaces), visible_apexes, libs_providers);
175*e5eeaa8eSAndroid Build Coastguard Worker }
176*e5eeaa8eSAndroid Build Coastguard Worker 
177*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace contents
178*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace linkerconfig
179*e5eeaa8eSAndroid Build Coastguard Worker }  // namespace android
180