| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
| * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
| * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
| * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
| * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
| * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| */ |
| |
| #pragma once |
| |
| #include <android/api-level.h> |
| |
| #include <stdlib.h> |
| #include <limits.h> |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| #include <unordered_map> |
| |
| #include <android-base/macros.h> |
| |
| #if defined(__LP64__) |
| static constexpr const char* kLibPath = "lib64"; |
| #else |
| static constexpr const char* kLibPath = "lib"; |
| #endif |
| |
| class NamespaceLinkConfig { |
| public: |
| NamespaceLinkConfig() = default; |
| NamespaceLinkConfig(const std::string& ns_name, const std::string& shared_libs, |
| bool allow_all_shared_libs) |
| : ns_name_(ns_name), shared_libs_(shared_libs), |
| allow_all_shared_libs_(allow_all_shared_libs) {} |
| |
| const std::string& ns_name() const { |
| return ns_name_; |
| } |
| |
| const std::string& shared_libs() const { |
| return shared_libs_; |
| } |
| |
| bool allow_all_shared_libs() const { |
| return allow_all_shared_libs_; |
| } |
| |
| private: |
| std::string ns_name_; |
| std::string shared_libs_; |
| bool allow_all_shared_libs_; |
| }; |
| |
| class NamespaceConfig { |
| public: |
| explicit NamespaceConfig(const std::string& name) |
| : name_(name), isolated_(false), visible_(false) |
| {} |
| |
| const char* name() const { |
| return name_.c_str(); |
| } |
| |
| bool isolated() const { |
| return isolated_; |
| } |
| |
| bool visible() const { |
| return visible_; |
| } |
| |
| const std::vector<std::string>& search_paths() const { |
| return search_paths_; |
| } |
| |
| const std::vector<std::string>& permitted_paths() const { |
| return permitted_paths_; |
| } |
| |
| const std::vector<std::string>& allowed_libs() const { return allowed_libs_; } |
| |
| const std::vector<NamespaceLinkConfig>& links() const { |
| return namespace_links_; |
| } |
| |
| void add_namespace_link(const std::string& ns_name, const std::string& shared_libs, |
| bool allow_all_shared_libs) { |
| namespace_links_.push_back(NamespaceLinkConfig(ns_name, shared_libs, allow_all_shared_libs)); |
| } |
| |
| void set_isolated(bool isolated) { |
| isolated_ = isolated; |
| } |
| |
| void set_visible(bool visible) { |
| visible_ = visible; |
| } |
| |
| void set_search_paths(std::vector<std::string>&& search_paths) { |
| search_paths_ = std::move(search_paths); |
| } |
| |
| void set_permitted_paths(std::vector<std::string>&& permitted_paths) { |
| permitted_paths_ = std::move(permitted_paths); |
| } |
| |
| void set_allowed_libs(std::vector<std::string>&& allowed_libs) { |
| allowed_libs_ = std::move(allowed_libs); |
| } |
| |
| private: |
| const std::string name_; |
| bool isolated_; |
| bool visible_; |
| std::vector<std::string> search_paths_; |
| std::vector<std::string> permitted_paths_; |
| std::vector<std::string> allowed_libs_; |
| std::vector<NamespaceLinkConfig> namespace_links_; |
| |
| DISALLOW_IMPLICIT_CONSTRUCTORS(NamespaceConfig); |
| }; |
| |
| class Config { |
| public: |
| Config() : target_sdk_version_(__ANDROID_API__) {} |
| |
| const std::vector<std::unique_ptr<NamespaceConfig>>& namespace_configs() const { |
| return namespace_configs_; |
| } |
| |
| const NamespaceConfig* default_namespace_config() const { |
| auto it = namespace_configs_map_.find("default"); |
| return it == namespace_configs_map_.end() ? nullptr : it->second; |
| } |
| |
| int target_sdk_version() const { |
| return target_sdk_version_; |
| } |
| |
| // note that this is one time event and therefore there is no need to |
| // read every section of the config. Every linker instance needs at |
| // most one configuration. |
| // Returns false in case of an error. If binary config was not found |
| // sets *config = nullptr. |
| static bool read_binary_config(const char* ld_config_file_path, |
| const char* binary_realpath, |
| bool is_asan, |
| bool is_hwasan, |
| const Config** config, |
| std::string* error_msg); |
| |
| static std::string get_vndk_version_string(const char delimiter); |
| private: |
| void clear(); |
| |
| void set_target_sdk_version(int target_sdk_version) { |
| target_sdk_version_ = target_sdk_version; |
| } |
| |
| NamespaceConfig* create_namespace_config(const std::string& name); |
| |
| std::vector<std::unique_ptr<NamespaceConfig>> namespace_configs_; |
| std::unordered_map<std::string, NamespaceConfig*> namespace_configs_map_; |
| int target_sdk_version_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Config); |
| }; |