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