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