Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f70a2fe4 authored by Victor Chang's avatar Victor Chang
Browse files

Remove the public libs in runtime namespace

These libs are listed in public.android.txt, but not exposed in the default namespace

Bug: 120786417
Bug: 121372395
Test: app can still DT_NEEDED libicuuc.so
Change-Id: I03dc51f04e29c2d15679c4daf82b05a812efb2db
parent bece53e5
Loading
Loading
Loading
Loading
+35 −0
Original line number Original line Diff line number Diff line
@@ -128,6 +128,12 @@ static constexpr const char* kWhitelistedDirectories = "/data:/mnt/expand";


static constexpr const char* kApexPath = "/apex/";
static constexpr const char* kApexPath = "/apex/";


#if defined(__LP64__)
static constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/lib64";
#else
static constexpr const char* kRuntimeApexLibPath = "/apex/com.android.runtime/lib";
#endif

static bool is_debuggable() {
static bool is_debuggable() {
  char debuggable[PROP_VALUE_MAX];
  char debuggable[PROP_VALUE_MAX];
  property_get("ro.debuggable", debuggable, "0");
  property_get("ro.debuggable", debuggable, "0");
@@ -399,6 +405,14 @@ class LibraryNamespaces {
      }
      }
    }
    }


    // Remove the public libs in the runtime namespace.
    // These libs are listed in public.android.txt, but we don't want the rest of android
    // in default namespace to dlopen the libs.
    // For example, libicuuc.so is exposed to classloader namespace from runtime namespace.
    // Unfortunately, it does not have stable C symbols, and default namespace should only use
    // stable symbols in libandroidicu.so. http://b/120786417
    removePublicLibsIfExistsInRuntimeApex(sonames);

    // android_init_namespaces() expects all the public libraries
    // android_init_namespaces() expects all the public libraries
    // to be loaded so that they can be found by soname alone.
    // to be loaded so that they can be found by soname alone.
    //
    //
@@ -493,6 +507,27 @@ class LibraryNamespaces {
    }
    }
  }
  }


  /**
   * Remove the public libs in runtime namespace
   */
  void removePublicLibsIfExistsInRuntimeApex(std::vector<std::string>& sonames) {
    for (const std::string& lib_name : kRuntimePublicLibraries) {
      std::string path(kRuntimeApexLibPath);
      path.append("/").append(lib_name);

      struct stat s;
      // Do nothing if the path in /apex does not exist.
      // Runtime APEX must be mounted since libnativeloader is in the same APEX
      if (stat(path.c_str(), &s) != 0) {
        continue;
      }

      auto it = std::find(sonames.begin(), sonames.end(), lib_name);
      if (it != sonames.end()) {
        sonames.erase(it);
      }
    }
  }


  bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames,
  bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames,
                  const std::function<bool(const std::string& /* soname */,
                  const std::function<bool(const std::string& /* soname */,