Merge "constexpr constructor for atfork_list_t"
diff --git a/libc/Android.mk b/libc/Android.mk
index ba3e5aa..456527a 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -697,6 +697,9 @@
include $(CLEAR_VARS)
LOCAL_SRC_FILES := bionic/__stack_chk_fail.cpp
+# On x86, the __set_tls implementation is complex enough that
+# -fstack-protector-strong inserts a check.
+LOCAL_SRC_FILES_x86 := arch-x86/bionic/__set_tls.c
LOCAL_CFLAGS := $(libc_common_cflags) -fno-stack-protector
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
LOCAL_CPPFLAGS := $(libc_common_cppflags)
diff --git a/libc/arch-x86/x86.mk b/libc/arch-x86/x86.mk
index b4056bb..1d717aa 100644
--- a/libc/arch-x86/x86.mk
+++ b/libc/arch-x86/x86.mk
@@ -109,7 +109,6 @@
arch-x86/bionic/libgcc_compat.c \
arch-x86/bionic/__restore.S \
arch-x86/bionic/setjmp.S \
- arch-x86/bionic/__set_tls.c \
arch-x86/bionic/syscall.S \
arch-x86/bionic/vfork.S \
diff --git a/libc/bionic/libc_init_common.cpp b/libc/bionic/libc_init_common.cpp
index 8f1ee95..b0c62d6 100644
--- a/libc/bionic/libc_init_common.cpp
+++ b/libc/bionic/libc_init_common.cpp
@@ -79,6 +79,10 @@
static pthread_internal_t main_thread;
+ // The x86 -fstack-protector implementation uses TLS, so make sure that's
+ // set up before we call any function that might get a stack check inserted.
+ __set_tls(main_thread.tls);
+
// Tell the kernel to clear our tid field when we exit, so we're like any other pthread.
// As a side-effect, this tells us our pid (which is the same as the main thread's tid).
main_thread.tid = __set_tid_address(&main_thread.tid);
@@ -97,7 +101,6 @@
__init_thread(&main_thread);
__init_tls(&main_thread);
- __set_tls(main_thread.tls);
// Store a pointer to the kernel argument block in a TLS slot to be
// picked up by the libc constructor.
diff --git a/libc/bionic/libc_logging.cpp b/libc/bionic/libc_logging.cpp
index 34867eb..67bb052 100644
--- a/libc/bionic/libc_logging.cpp
+++ b/libc/bionic/libc_logging.cpp
@@ -514,7 +514,7 @@
// rare, we can accept a trylock failure gracefully.
static pthread_mutex_t lock_clockid = PTHREAD_MUTEX_INITIALIZER;
-static clockid_t android_log_clockid()
+static clockid_t __android_log_clockid()
{
static struct cache r_time_cache = { NULL, static_cast<uint32_t>(-1), 0 };
static struct cache p_time_cache = { NULL, static_cast<uint32_t>(-1), 0 };
@@ -563,7 +563,7 @@
vec[1].iov_base = &tid;
vec[1].iov_len = sizeof(tid);
timespec ts;
- clock_gettime(android_log_clockid(), &ts);
+ clock_gettime(__android_log_clockid(), &ts);
log_time realtime_ts;
realtime_ts.tv_sec = ts.tv_sec;
realtime_ts.tv_nsec = ts.tv_nsec;
@@ -606,7 +606,7 @@
vec[1].iov_base = &tid;
vec[1].iov_len = sizeof(tid);
timespec ts;
- clock_gettime(android_log_clockid(), &ts);
+ clock_gettime(__android_log_clockid(), &ts);
log_time realtime_ts;
realtime_ts.tv_sec = ts.tv_sec;
realtime_ts.tv_nsec = ts.tv_nsec;
diff --git a/libc/include/android/dlext.h b/libc/include/android/dlext.h
index ed9a3b9..7979c43 100644
--- a/libc/include/android/dlext.h
+++ b/libc/include/android/dlext.h
@@ -152,16 +152,20 @@
* 2. In directories specified by DT_RUNPATH of the "needed by" binary.
* 3. deault_library_path (This of this as namespace-local default library path)
*
- * When is_isolated is true the resulted namespace requires all of the libraries
- * to be on the search path; the search_path is ld_library_path:default_library_path.
+ * When is_isolated is true the resulting namespace requires all of the libraries
+ * to be on the search path or under the permitted_when_isolated_path; the search_path is
+ * ld_library_path:default_library_path. Note that the permitted_when_isolated_path path
+ * is not part of the search_path and does not affect the search order. It is a way
+ * to allow loading libraries from specific locations when using absolute path.
*
- * If a library or any of its dependencies are outside of the search path and not
- * part of the public namespace dlopen will fail.
+ * If a library or any of its dependencies are outside of the permitted_when_isolated_path
+ * and search_path, and it is not part of the public namespace dlopen will fail.
*/
extern struct android_namespace_t* android_create_namespace(const char* name,
const char* ld_library_path,
const char* default_library_path,
- bool is_isolated);
+ bool is_isolated,
+ const char* permitted_when_isolated_path);
__END_DECLS
diff --git a/libdl/libdl.c b/libdl/libdl.c
index 3928ba2..af2f83e 100644
--- a/libdl/libdl.c
+++ b/libdl/libdl.c
@@ -57,6 +57,7 @@
struct android_namespace_t* android_create_namespace(const char* name __unused,
const char* ld_library_path __unused,
const char* default_library_path __unused,
- bool isolated __unused) {
+ bool isolated __unused,
+ const char* permitted_when_isolated_path __unused) {
return 0;
}
diff --git a/libm/Android.bp b/libm/Android.bp
index 0fc860a..081a139 100644
--- a/libm/Android.bp
+++ b/libm/Android.bp
@@ -3,18 +3,7 @@
bionic_coverage = false
-// TODO: this comes from from upstream's libc, not libm, but it's an
-// implementation detail that should have hidden visibility, so it needs
-// to be in whatever library the math code is in.
-libm_common_src_files = ["digittoint.c"]
-
-// TODO: this is not in the BSDs.
-libm_common_src_files += [
- "significandl.c",
- "sincos.c",
-]
-
-libm_common_src_files += [
+libm_common_src_files = [
"upstream-freebsd/lib/msun/bsdsrc/b_exp.c",
"upstream-freebsd/lib/msun/bsdsrc/b_log.c",
"upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c",
@@ -186,8 +175,19 @@
]
libm_common_src_files += [
- "fake_long_double.c",
+ // TODO: this comes from from upstream's libc, not libm, but it's an
+ // implementation detail that should have hidden visibility, so it needs
+ // to be in whatever library the math code is in.
+ "digittoint.c",
+
+ // Functionality not in the BSDs.
+ "significandl.c",
+ "sincos.c",
+
+ // Modified versions of BSD code.
"signbit.c",
+
+ // Home-grown stuff.
"fabs.cpp",
]
@@ -292,6 +292,9 @@
sanitize: ["never"],
multilib: {
+ lib32: {
+ srcs: ["fake_long_double.c"],
+ },
lib64: {
srcs: libm_ld128_src_files,
local_include_dirs: libm_ld_local_includes,
@@ -307,15 +310,18 @@
arm: {
srcs: [
"arm/fenv.c",
- "arm/sqrt.S",
- "arm/floor.S",
],
- exclude_srcs: [
- // TODO: these require neon not available in arm
- "upstream-freebsd/lib/msun/src/e_sqrt.c",
- "upstream-freebsd/lib/msun/src/e_sqrtf.c",
- "upstream-freebsd/lib/msun/src/s_floor.c",
- ],
+ armv7_a_neon: {
+ srcs: [
+ "arm/sqrt.S",
+ "arm/floor.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+ "upstream-freebsd/lib/msun/src/s_floor.c",
+ ],
+ },
instruction_set: "arm",
ldflags: ["-Wl,--hash-style=both"],
version_script: "libm.arm.map",
@@ -323,8 +329,8 @@
arm64: {
srcs: [
- "arm64/fenv.c",
"arm64/ceil.S",
+ "arm64/fenv.c",
"arm64/fma.S",
"arm64/floor.S",
"arm64/lrint.S",
@@ -333,6 +339,8 @@
"arm64/trunc.S",
],
exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
"upstream-freebsd/lib/msun/src/s_ceil.c",
"upstream-freebsd/lib/msun/src/s_ceilf.c",
"upstream-freebsd/lib/msun/src/s_fma.c",
@@ -345,8 +353,6 @@
"upstream-freebsd/lib/msun/src/s_lrintf.c",
"upstream-freebsd/lib/msun/src/s_rint.c",
"upstream-freebsd/lib/msun/src/s_rintf.c",
- "upstream-freebsd/lib/msun/src/e_sqrt.c",
- "upstream-freebsd/lib/msun/src/e_sqrtf.c",
"upstream-freebsd/lib/msun/src/s_trunc.c",
"upstream-freebsd/lib/msun/src/s_truncf.c",
],
@@ -364,8 +370,73 @@
},
x86: {
+ srcs: [
+ "i387/fenv.c",
+ "x86/sqrt.S",
+ "x86/sqrtf.S",
+ "x86/e_acos.S",
+ "x86/e_asin.S",
+ "x86/e_atan2.S",
+ "x86/e_cosh.S",
+ "x86/e_exp.S",
+ "x86/e_hypot.S",
+ "x86/e_log10.S",
+ "x86/e_log.S",
+ "x86/e_pow.S",
+ "x86/e_sinh.S",
+ "x86/libm_reduce_pi04l.S",
+ "x86/libm_sincos_huge.S",
+ "x86/libm_tancot_huge.S",
+ "x86/s_atan.S",
+ "x86/s_cbrt.S",
+ "x86/s_cos.S",
+ "x86/s_expm1.S",
+ "x86/s_log1p.S",
+ "x86/s_sin.S",
+ "x86/s_tanh.S",
+ "x86/s_tan.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/e_acos.c",
+ "upstream-freebsd/lib/msun/src/e_asin.c",
+ "upstream-freebsd/lib/msun/src/e_atan2.c",
+ "upstream-freebsd/lib/msun/src/e_cosh.c",
+ "upstream-freebsd/lib/msun/src/e_exp.c",
+ "upstream-freebsd/lib/msun/src/e_hypot.c",
+ "upstream-freebsd/lib/msun/src/e_log.c",
+ "upstream-freebsd/lib/msun/src/e_log10.c",
+ "upstream-freebsd/lib/msun/src/e_pow.c",
+ "upstream-freebsd/lib/msun/src/e_sinh.c",
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+ "upstream-freebsd/lib/msun/src/s_atan.c",
+ "upstream-freebsd/lib/msun/src/s_cbrt.c",
+ "upstream-freebsd/lib/msun/src/s_cos.c",
+ "upstream-freebsd/lib/msun/src/s_expm1.c",
+ "upstream-freebsd/lib/msun/src/s_log1p.c",
+ "upstream-freebsd/lib/msun/src/s_sin.c",
+ "upstream-freebsd/lib/msun/src/s_tan.c",
+ "upstream-freebsd/lib/msun/src/s_tanh.c",
+ ],
+ sse4_1: {
+ srcs: [
+ "x86/ceil.S",
+ "x86/ceilf.S",
+ "x86/floor.S",
+ "x86/floorf.S",
+ "x86/trunc.S",
+ "x86/truncf.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/s_ceil.c",
+ "upstream-freebsd/lib/msun/src/s_ceilf.c",
+ "upstream-freebsd/lib/msun/src/s_floor.c",
+ "upstream-freebsd/lib/msun/src/s_floorf.c",
+ "upstream-freebsd/lib/msun/src/s_trunc.c",
+ "upstream-freebsd/lib/msun/src/s_truncf.c",
+ ],
+ },
local_include_dirs: ["i387"],
- srcs: ["i387/fenv.c"],
// Clang has wrong long double sizes for x86.
clang: false,
ldflags: ["-Wl,--hash-style=both"],
@@ -373,7 +444,69 @@
},
x86_64: {
- srcs: ["amd64/fenv.c"],
+ srcs: [
+ "amd64/fenv.c",
+ "x86_64/sqrt.S",
+ "x86_64/sqrtf.S",
+ "x86_64/e_acos.S",
+ "x86_64/e_asin.S",
+ "x86_64/e_atan2.S",
+ "x86_64/e_cosh.S",
+ "x86_64/e_exp.S",
+ "x86_64/e_hypot.S",
+ "x86_64/e_log10.S",
+ "x86_64/e_log.S",
+ "x86_64/e_pow.S",
+ "x86_64/e_sinh.S",
+ "x86_64/s_atan.S",
+ "x86_64/s_cbrt.S",
+ "x86_64/s_cos.S",
+ "x86_64/s_expm1.S",
+ "x86_64/s_log1p.S",
+ "x86_64/s_sin.S",
+ "x86_64/s_tanh.S",
+ "x86_64/s_tan.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/e_acos.c",
+ "upstream-freebsd/lib/msun/src/e_asin.c",
+ "upstream-freebsd/lib/msun/src/e_atan2.c",
+ "upstream-freebsd/lib/msun/src/e_cosh.c",
+ "upstream-freebsd/lib/msun/src/e_exp.c",
+ "upstream-freebsd/lib/msun/src/e_hypot.c",
+ "upstream-freebsd/lib/msun/src/e_log.c",
+ "upstream-freebsd/lib/msun/src/e_log10.c",
+ "upstream-freebsd/lib/msun/src/e_pow.c",
+ "upstream-freebsd/lib/msun/src/e_sinh.c",
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+ "upstream-freebsd/lib/msun/src/s_atan.c",
+ "upstream-freebsd/lib/msun/src/s_cbrt.c",
+ "upstream-freebsd/lib/msun/src/s_cos.c",
+ "upstream-freebsd/lib/msun/src/s_expm1.c",
+ "upstream-freebsd/lib/msun/src/s_log1p.c",
+ "upstream-freebsd/lib/msun/src/s_sin.c",
+ "upstream-freebsd/lib/msun/src/s_tan.c",
+ "upstream-freebsd/lib/msun/src/s_tanh.c",
+ ],
+ sse4_1: {
+ srcs: [
+ "x86_64/ceil.S",
+ "x86_64/ceilf.S",
+ "x86_64/floor.S",
+ "x86_64/floorf.S",
+ "x86_64/trunc.S",
+ "x86_64/truncf.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/s_ceil.c",
+ "upstream-freebsd/lib/msun/src/s_ceilf.c",
+ "upstream-freebsd/lib/msun/src/s_floor.c",
+ "upstream-freebsd/lib/msun/src/s_floorf.c",
+ "upstream-freebsd/lib/msun/src/s_trunc.c",
+ "upstream-freebsd/lib/msun/src/s_truncf.c",
+ ],
+ },
// Clang has wrong long double sizes for x86.
clang: false,
version_script: "libm.x86_64.map",
diff --git a/libm/Android.mk b/libm/Android.mk
index bd51e7c..faf3c50 100644
--- a/libm/Android.mk
+++ b/libm/Android.mk
@@ -22,14 +22,19 @@
upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c \
upstream-freebsd/lib/msun/src/catrig.c \
upstream-freebsd/lib/msun/src/catrigf.c \
+ upstream-freebsd/lib/msun/src/e_acos.c \
upstream-freebsd/lib/msun/src/e_acosf.c \
upstream-freebsd/lib/msun/src/e_acosh.c \
upstream-freebsd/lib/msun/src/e_acoshf.c \
+ upstream-freebsd/lib/msun/src/e_asin.c \
upstream-freebsd/lib/msun/src/e_asinf.c \
+ upstream-freebsd/lib/msun/src/e_atan2.c \
upstream-freebsd/lib/msun/src/e_atan2f.c \
upstream-freebsd/lib/msun/src/e_atanh.c \
upstream-freebsd/lib/msun/src/e_atanhf.c \
+ upstream-freebsd/lib/msun/src/e_cosh.c \
upstream-freebsd/lib/msun/src/e_coshf.c \
+ upstream-freebsd/lib/msun/src/e_exp.c \
upstream-freebsd/lib/msun/src/e_expf.c \
upstream-freebsd/lib/msun/src/e_fmod.c \
upstream-freebsd/lib/msun/src/e_fmodf.c \
@@ -37,6 +42,7 @@
upstream-freebsd/lib/msun/src/e_gammaf.c \
upstream-freebsd/lib/msun/src/e_gammaf_r.c \
upstream-freebsd/lib/msun/src/e_gamma_r.c \
+ upstream-freebsd/lib/msun/src/e_hypot.c \
upstream-freebsd/lib/msun/src/e_hypotf.c \
upstream-freebsd/lib/msun/src/e_j0.c \
upstream-freebsd/lib/msun/src/e_j0f.c \
@@ -48,10 +54,13 @@
upstream-freebsd/lib/msun/src/e_lgammaf.c \
upstream-freebsd/lib/msun/src/e_lgammaf_r.c \
upstream-freebsd/lib/msun/src/e_lgamma_r.c \
+ upstream-freebsd/lib/msun/src/e_log10.c \
upstream-freebsd/lib/msun/src/e_log10f.c \
upstream-freebsd/lib/msun/src/e_log2.c \
upstream-freebsd/lib/msun/src/e_log2f.c \
+ upstream-freebsd/lib/msun/src/e_log.c \
upstream-freebsd/lib/msun/src/e_logf.c \
+ upstream-freebsd/lib/msun/src/e_pow.c \
upstream-freebsd/lib/msun/src/e_powf.c \
upstream-freebsd/lib/msun/src/e_remainder.c \
upstream-freebsd/lib/msun/src/e_remainderf.c \
@@ -59,7 +68,10 @@
upstream-freebsd/lib/msun/src/e_rem_pio2f.c \
upstream-freebsd/lib/msun/src/e_scalb.c \
upstream-freebsd/lib/msun/src/e_scalbf.c \
+ upstream-freebsd/lib/msun/src/e_sinh.c \
upstream-freebsd/lib/msun/src/e_sinhf.c \
+ upstream-freebsd/lib/msun/src/e_sqrt.c \
+ upstream-freebsd/lib/msun/src/e_sqrtf.c \
upstream-freebsd/lib/msun/src/imprecise.c \
upstream-freebsd/lib/msun/src/k_cos.c \
upstream-freebsd/lib/msun/src/k_cosf.c \
@@ -72,13 +84,17 @@
upstream-freebsd/lib/msun/src/k_tanf.c \
upstream-freebsd/lib/msun/src/s_asinh.c \
upstream-freebsd/lib/msun/src/s_asinhf.c \
+ upstream-freebsd/lib/msun/src/s_atan.c \
upstream-freebsd/lib/msun/src/s_atanf.c \
upstream-freebsd/lib/msun/src/s_carg.c \
upstream-freebsd/lib/msun/src/s_cargf.c \
upstream-freebsd/lib/msun/src/s_cargl.c \
+ upstream-freebsd/lib/msun/src/s_cbrt.c \
upstream-freebsd/lib/msun/src/s_cbrtf.c \
upstream-freebsd/lib/msun/src/s_ccosh.c \
upstream-freebsd/lib/msun/src/s_ccoshf.c \
+ upstream-freebsd/lib/msun/src/s_ceil.c \
+ upstream-freebsd/lib/msun/src/s_ceilf.c \
upstream-freebsd/lib/msun/src/s_cexp.c \
upstream-freebsd/lib/msun/src/s_cexpf.c \
upstream-freebsd/lib/msun/src/s_cimag.c \
@@ -89,6 +105,7 @@
upstream-freebsd/lib/msun/src/s_conjl.c \
upstream-freebsd/lib/msun/src/s_copysign.c \
upstream-freebsd/lib/msun/src/s_copysignf.c \
+ upstream-freebsd/lib/msun/src/s_cos.c \
upstream-freebsd/lib/msun/src/s_cosf.c \
upstream-freebsd/lib/msun/src/s_cproj.c \
upstream-freebsd/lib/msun/src/s_cprojf.c \
@@ -107,10 +124,15 @@
upstream-freebsd/lib/msun/src/s_erff.c \
upstream-freebsd/lib/msun/src/s_exp2.c \
upstream-freebsd/lib/msun/src/s_exp2f.c \
+ upstream-freebsd/lib/msun/src/s_expm1.c \
upstream-freebsd/lib/msun/src/s_expm1f.c \
upstream-freebsd/lib/msun/src/s_fdim.c \
upstream-freebsd/lib/msun/src/s_finite.c \
upstream-freebsd/lib/msun/src/s_finitef.c \
+ upstream-freebsd/lib/msun/src/s_floor.c \
+ upstream-freebsd/lib/msun/src/s_floorf.c \
+ upstream-freebsd/lib/msun/src/s_fma.c \
+ upstream-freebsd/lib/msun/src/s_fmaf.c \
upstream-freebsd/lib/msun/src/s_fmax.c \
upstream-freebsd/lib/msun/src/s_fmaxf.c \
upstream-freebsd/lib/msun/src/s_fmin.c \
@@ -119,11 +141,16 @@
upstream-freebsd/lib/msun/src/s_frexpf.c \
upstream-freebsd/lib/msun/src/s_ilogb.c \
upstream-freebsd/lib/msun/src/s_ilogbf.c \
+ upstream-freebsd/lib/msun/src/s_llrint.c \
+ upstream-freebsd/lib/msun/src/s_llrintf.c \
upstream-freebsd/lib/msun/src/s_llround.c \
upstream-freebsd/lib/msun/src/s_llroundf.c \
+ upstream-freebsd/lib/msun/src/s_log1p.c \
upstream-freebsd/lib/msun/src/s_log1pf.c \
upstream-freebsd/lib/msun/src/s_logb.c \
upstream-freebsd/lib/msun/src/s_logbf.c \
+ upstream-freebsd/lib/msun/src/s_lrint.c \
+ upstream-freebsd/lib/msun/src/s_lrintf.c \
upstream-freebsd/lib/msun/src/s_lround.c \
upstream-freebsd/lib/msun/src/s_lroundf.c \
upstream-freebsd/lib/msun/src/s_modf.c \
@@ -134,6 +161,8 @@
upstream-freebsd/lib/msun/src/s_nextafterf.c \
upstream-freebsd/lib/msun/src/s_remquo.c \
upstream-freebsd/lib/msun/src/s_remquof.c \
+ upstream-freebsd/lib/msun/src/s_rint.c \
+ upstream-freebsd/lib/msun/src/s_rintf.c \
upstream-freebsd/lib/msun/src/s_round.c \
upstream-freebsd/lib/msun/src/s_roundf.c \
upstream-freebsd/lib/msun/src/s_scalbln.c \
@@ -142,10 +171,15 @@
upstream-freebsd/lib/msun/src/s_signgam.c \
upstream-freebsd/lib/msun/src/s_significand.c \
upstream-freebsd/lib/msun/src/s_significandf.c \
+ upstream-freebsd/lib/msun/src/s_sin.c \
upstream-freebsd/lib/msun/src/s_sinf.c \
+ upstream-freebsd/lib/msun/src/s_tan.c \
upstream-freebsd/lib/msun/src/s_tanf.c \
+ upstream-freebsd/lib/msun/src/s_tanh.c \
upstream-freebsd/lib/msun/src/s_tanhf.c \
upstream-freebsd/lib/msun/src/s_tgammaf.c \
+ upstream-freebsd/lib/msun/src/s_trunc.c \
+ upstream-freebsd/lib/msun/src/s_truncf.c \
upstream-freebsd/lib/msun/src/w_cabs.c \
upstream-freebsd/lib/msun/src/w_cabsf.c \
upstream-freebsd/lib/msun/src/w_cabsl.c \
@@ -236,37 +270,6 @@
# -----------------------------------------------------------------------------
LOCAL_SRC_FILES_arm += \
arm/fenv.c \
- upstream-freebsd/lib/msun/src/e_acos.c \
- upstream-freebsd/lib/msun/src/e_asin.c \
- upstream-freebsd/lib/msun/src/e_atan2.c \
- upstream-freebsd/lib/msun/src/e_cosh.c \
- upstream-freebsd/lib/msun/src/e_exp.c \
- upstream-freebsd/lib/msun/src/e_hypot.c \
- upstream-freebsd/lib/msun/src/e_log.c \
- upstream-freebsd/lib/msun/src/e_log10.c \
- upstream-freebsd/lib/msun/src/e_pow.c \
- upstream-freebsd/lib/msun/src/e_sinh.c \
- upstream-freebsd/lib/msun/src/s_atan.c \
- upstream-freebsd/lib/msun/src/s_cbrt.c \
- upstream-freebsd/lib/msun/src/s_ceil.c \
- upstream-freebsd/lib/msun/src/s_ceilf.c \
- upstream-freebsd/lib/msun/src/s_cos.c \
- upstream-freebsd/lib/msun/src/s_fma.c \
- upstream-freebsd/lib/msun/src/s_fmaf.c \
- upstream-freebsd/lib/msun/src/s_floorf.c \
- upstream-freebsd/lib/msun/src/s_expm1.c \
- upstream-freebsd/lib/msun/src/s_llrint.c \
- upstream-freebsd/lib/msun/src/s_llrintf.c \
- upstream-freebsd/lib/msun/src/s_log1p.c \
- upstream-freebsd/lib/msun/src/s_lrint.c \
- upstream-freebsd/lib/msun/src/s_lrintf.c \
- upstream-freebsd/lib/msun/src/s_rint.c \
- upstream-freebsd/lib/msun/src/s_rintf.c \
- upstream-freebsd/lib/msun/src/s_sin.c \
- upstream-freebsd/lib/msun/src/s_tan.c \
- upstream-freebsd/lib/msun/src/s_tanh.c \
- upstream-freebsd/lib/msun/src/s_trunc.c \
- upstream-freebsd/lib/msun/src/s_truncf.c \
# s_floor.S requires neon instructions.
ifdef TARGET_2ND_ARCH
@@ -276,17 +279,16 @@
endif
# Use the C version on armv7-a since it doesn't support neon instructions.
-ifeq ($(arch_variant),armv7-a)
-LOCAL_SRC_FILES_arm += \
- upstream-freebsd/lib/msun/src/e_sqrt.c \
- upstream-freebsd/lib/msun/src/e_sqrtf.c \
- upstream-freebsd/lib/msun/src/s_floor.c \
-
-else
+ifneq ($(arch_variant),armv7-a)
LOCAL_SRC_FILES_arm += \
arm/sqrt.S \
arm/floor.S \
+LOCAL_SRC_FILES_EXCLUDE_arm += \
+ upstream-freebsd/lib/msun/src/e_sqrt.c \
+ upstream-freebsd/lib/msun/src/e_sqrtf.c \
+ upstream-freebsd/lib/msun/src/s_floor.c \
+
endif
# -----------------------------------------------------------------------------
@@ -301,64 +303,30 @@
arm64/rint.S \
arm64/sqrt.S \
arm64/trunc.S \
- upstream-freebsd/lib/msun/src/e_acos.c \
- upstream-freebsd/lib/msun/src/e_asin.c \
- upstream-freebsd/lib/msun/src/e_atan2.c \
- upstream-freebsd/lib/msun/src/e_cosh.c \
- upstream-freebsd/lib/msun/src/e_exp.c \
- upstream-freebsd/lib/msun/src/e_hypot.c \
- upstream-freebsd/lib/msun/src/e_log.c \
- upstream-freebsd/lib/msun/src/e_log10.c \
- upstream-freebsd/lib/msun/src/e_pow.c \
- upstream-freebsd/lib/msun/src/e_sinh.c \
- upstream-freebsd/lib/msun/src/s_atan.c \
- upstream-freebsd/lib/msun/src/s_cbrt.c \
- upstream-freebsd/lib/msun/src/s_cos.c \
- upstream-freebsd/lib/msun/src/s_expm1.c \
- upstream-freebsd/lib/msun/src/s_log1p.c \
- upstream-freebsd/lib/msun/src/s_sin.c \
- upstream-freebsd/lib/msun/src/s_tan.c \
- upstream-freebsd/lib/msun/src/s_tanh.c \
+
+LOCAL_SRC_FILES_EXCLUDE_arm64 += \
+ upstream-freebsd/lib/msun/src/e_sqrt.c \
+ upstream-freebsd/lib/msun/src/e_sqrtf.c \
+ upstream-freebsd/lib/msun/src/s_ceil.c \
+ upstream-freebsd/lib/msun/src/s_ceilf.c \
+ upstream-freebsd/lib/msun/src/s_fma.c \
+ upstream-freebsd/lib/msun/src/s_fmaf.c \
+ upstream-freebsd/lib/msun/src/s_floor.c \
+ upstream-freebsd/lib/msun/src/s_floorf.c \
+ upstream-freebsd/lib/msun/src/s_llrint.c \
+ upstream-freebsd/lib/msun/src/s_llrintf.c \
+ upstream-freebsd/lib/msun/src/s_lrint.c \
+ upstream-freebsd/lib/msun/src/s_lrintf.c \
+ upstream-freebsd/lib/msun/src/s_rint.c \
+ upstream-freebsd/lib/msun/src/s_rintf.c \
+ upstream-freebsd/lib/msun/src/s_trunc.c \
+ upstream-freebsd/lib/msun/src/s_truncf.c \
# -----------------------------------------------------------------------------
# mips
# -----------------------------------------------------------------------------
libm_mips_arch_files := \
mips/fenv.c \
- upstream-freebsd/lib/msun/src/e_acos.c \
- upstream-freebsd/lib/msun/src/e_asin.c \
- upstream-freebsd/lib/msun/src/e_atan2.c \
- upstream-freebsd/lib/msun/src/e_cosh.c \
- upstream-freebsd/lib/msun/src/e_exp.c \
- upstream-freebsd/lib/msun/src/e_hypot.c \
- upstream-freebsd/lib/msun/src/e_log.c \
- upstream-freebsd/lib/msun/src/e_log10.c \
- upstream-freebsd/lib/msun/src/e_pow.c \
- upstream-freebsd/lib/msun/src/e_sinh.c \
- upstream-freebsd/lib/msun/src/e_sqrt.c \
- upstream-freebsd/lib/msun/src/e_sqrtf.c \
- upstream-freebsd/lib/msun/src/s_atan.c \
- upstream-freebsd/lib/msun/src/s_cbrt.c \
- upstream-freebsd/lib/msun/src/s_ceil.c \
- upstream-freebsd/lib/msun/src/s_ceilf.c \
- upstream-freebsd/lib/msun/src/s_cos.c \
- upstream-freebsd/lib/msun/src/s_fma.c \
- upstream-freebsd/lib/msun/src/s_fmaf.c \
- upstream-freebsd/lib/msun/src/s_floor.c \
- upstream-freebsd/lib/msun/src/s_floorf.c \
- upstream-freebsd/lib/msun/src/s_expm1.c \
- upstream-freebsd/lib/msun/src/s_llrint.c \
- upstream-freebsd/lib/msun/src/s_llrintf.c \
- upstream-freebsd/lib/msun/src/s_log1p.c \
- upstream-freebsd/lib/msun/src/s_lrint.c \
- upstream-freebsd/lib/msun/src/s_lrintf.c \
- upstream-freebsd/lib/msun/src/s_rint.c \
- upstream-freebsd/lib/msun/src/s_rintf.c \
- upstream-freebsd/lib/msun/src/s_sin.c \
- upstream-freebsd/lib/msun/src/s_tan.c \
- upstream-freebsd/lib/msun/src/s_tanh.c \
- upstream-freebsd/lib/msun/src/s_trunc.c \
- upstream-freebsd/lib/msun/src/s_truncf.c \
LOCAL_SRC_FILES_mips += $(libm_mips_arch_files)
LOCAL_SRC_FILES_mips64 += $(libm_mips_arch_files)
@@ -368,14 +336,6 @@
# -----------------------------------------------------------------------------
LOCAL_SRC_FILES_x86 += \
i387/fenv.c \
- upstream-freebsd/lib/msun/src/s_fma.c \
- upstream-freebsd/lib/msun/src/s_fmaf.c \
- upstream-freebsd/lib/msun/src/s_llrint.c \
- upstream-freebsd/lib/msun/src/s_llrintf.c \
- upstream-freebsd/lib/msun/src/s_lrint.c \
- upstream-freebsd/lib/msun/src/s_lrintf.c \
- upstream-freebsd/lib/msun/src/s_rint.c \
- upstream-freebsd/lib/msun/src/s_rintf.c \
x86/sqrt.S \
x86/sqrtf.S \
x86/e_acos.S \
@@ -400,6 +360,28 @@
x86/s_tanh.S \
x86/s_tan.S \
+LOCAL_SRC_FILES_EXCLUDE_x86 += \
+ upstream-freebsd/lib/msun/src/e_acos.c \
+ upstream-freebsd/lib/msun/src/e_asin.c \
+ upstream-freebsd/lib/msun/src/e_atan2.c \
+ upstream-freebsd/lib/msun/src/e_cosh.c \
+ upstream-freebsd/lib/msun/src/e_exp.c \
+ upstream-freebsd/lib/msun/src/e_hypot.c \
+ upstream-freebsd/lib/msun/src/e_log.c \
+ upstream-freebsd/lib/msun/src/e_log10.c \
+ upstream-freebsd/lib/msun/src/e_pow.c \
+ upstream-freebsd/lib/msun/src/e_sinh.c \
+ upstream-freebsd/lib/msun/src/e_sqrt.c \
+ upstream-freebsd/lib/msun/src/e_sqrtf.c \
+ upstream-freebsd/lib/msun/src/s_atan.c \
+ upstream-freebsd/lib/msun/src/s_cbrt.c \
+ upstream-freebsd/lib/msun/src/s_cos.c \
+ upstream-freebsd/lib/msun/src/s_expm1.c \
+ upstream-freebsd/lib/msun/src/s_log1p.c \
+ upstream-freebsd/lib/msun/src/s_sin.c \
+ upstream-freebsd/lib/msun/src/s_tan.c \
+ upstream-freebsd/lib/msun/src/s_tanh.c \
+
ifeq ($(ARCH_X86_HAVE_SSE4_1),true)
LOCAL_SRC_FILES_x86 += \
x86/ceil.S \
@@ -409,8 +391,7 @@
x86/trunc.S \
x86/truncf.S \
-else
-LOCAL_SRC_FILES_x86 += \
+LOCAL_SRC_FILES_EXCLUDE_x86 += \
upstream-freebsd/lib/msun/src/s_ceil.c \
upstream-freebsd/lib/msun/src/s_ceilf.c \
upstream-freebsd/lib/msun/src/s_floor.c \
@@ -425,14 +406,6 @@
# -----------------------------------------------------------------------------
LOCAL_SRC_FILES_x86_64 += \
amd64/fenv.c \
- upstream-freebsd/lib/msun/src/s_fma.c \
- upstream-freebsd/lib/msun/src/s_fmaf.c \
- upstream-freebsd/lib/msun/src/s_llrint.c \
- upstream-freebsd/lib/msun/src/s_llrintf.c \
- upstream-freebsd/lib/msun/src/s_lrint.c \
- upstream-freebsd/lib/msun/src/s_lrintf.c \
- upstream-freebsd/lib/msun/src/s_rint.c \
- upstream-freebsd/lib/msun/src/s_rintf.c \
x86_64/sqrt.S \
x86_64/sqrtf.S \
x86_64/e_acos.S \
@@ -454,6 +427,28 @@
x86_64/s_tanh.S \
x86_64/s_tan.S \
+LOCAL_SRC_FILES_EXCLUDE_x86_64 += \
+ upstream-freebsd/lib/msun/src/e_acos.c \
+ upstream-freebsd/lib/msun/src/e_asin.c \
+ upstream-freebsd/lib/msun/src/e_atan2.c \
+ upstream-freebsd/lib/msun/src/e_cosh.c \
+ upstream-freebsd/lib/msun/src/e_exp.c \
+ upstream-freebsd/lib/msun/src/e_hypot.c \
+ upstream-freebsd/lib/msun/src/e_log.c \
+ upstream-freebsd/lib/msun/src/e_log10.c \
+ upstream-freebsd/lib/msun/src/e_pow.c \
+ upstream-freebsd/lib/msun/src/e_sinh.c \
+ upstream-freebsd/lib/msun/src/e_sqrt.c \
+ upstream-freebsd/lib/msun/src/e_sqrtf.c \
+ upstream-freebsd/lib/msun/src/s_atan.c \
+ upstream-freebsd/lib/msun/src/s_cbrt.c \
+ upstream-freebsd/lib/msun/src/s_cos.c \
+ upstream-freebsd/lib/msun/src/s_expm1.c \
+ upstream-freebsd/lib/msun/src/s_log1p.c \
+ upstream-freebsd/lib/msun/src/s_sin.c \
+ upstream-freebsd/lib/msun/src/s_tan.c \
+ upstream-freebsd/lib/msun/src/s_tanh.c \
+
ifeq ($(ARCH_X86_HAVE_SSE4_1),true)
LOCAL_SRC_FILES_x86_64 += \
x86_64/ceil.S \
@@ -463,8 +458,7 @@
x86_64/trunc.S \
x86_64/truncf.S \
-else
-LOCAL_SRC_FILES_x86_64 += \
+LOCAL_SRC_FILES_EXCLUDE_x86_64 += \
upstream-freebsd/lib/msun/src/s_ceil.c \
upstream-freebsd/lib/msun/src/s_ceilf.c \
upstream-freebsd/lib/msun/src/s_floor.c \
diff --git a/linker/dlfcn.cpp b/linker/dlfcn.cpp
index d07ec86..fde9f5c 100644
--- a/linker/dlfcn.cpp
+++ b/linker/dlfcn.cpp
@@ -193,11 +193,12 @@
}
android_namespace_t* android_create_namespace(const char* name, const char* ld_library_path,
- const char* default_library_path, bool is_isolated) {
+ const char* default_library_path, bool is_isolated,
+ const char* permitted_when_isolated_path) {
ScopedPthreadMutexLocker locker(&g_dl_mutex);
- android_namespace_t* result = create_namespace(name, ld_library_path,
- default_library_path, is_isolated);
+ android_namespace_t* result = create_namespace(name, ld_library_path, default_library_path,
+ is_isolated, permitted_when_isolated_path);
if (result == nullptr) {
__bionic_format_dlerror("android_create_namespace failed", linker_get_error_buffer());
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 82d0d9e..66955da 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -37,7 +37,6 @@
#include <string.h>
#include <sys/mman.h>
#include <sys/param.h>
-#include <sys/prctl.h>
#include <unistd.h>
#include <new>
@@ -94,6 +93,10 @@
default_library_paths_ = library_paths;
}
+ void set_permitted_paths(std::vector<std::string>&& permitted_paths) {
+ permitted_paths_ = permitted_paths;
+ }
+
soinfo::soinfo_list_t& soinfo_list() { return soinfo_list_; }
// For isolated namespaces - checks if the file is on the search path;
@@ -105,6 +108,7 @@
bool is_isolated_;
std::vector<std::string> ld_library_paths_;
std::vector<std::string> default_library_paths_;
+ std::vector<std::string> permitted_paths_;
soinfo::soinfo_list_t soinfo_list_;
DISALLOW_COPY_AND_ASSIGN(android_namespace_t);
@@ -316,6 +320,12 @@
}
}
+ for (const auto& dir : permitted_paths_) {
+ if (file_is_under_dir(file, dir)) {
+ return true;
+ }
+ }
+
return false;
}
@@ -544,13 +554,6 @@
static bool realpath_fd(int fd, std::string* realpath) {
std::vector<char> buf(PATH_MAX), proc_self_fd(PATH_MAX);
__libc_format_buffer(&proc_self_fd[0], proc_self_fd.size(), "/proc/self/fd/%d", fd);
- // set DUMPABLE to 1 to access /proc/self/fd
- int dumpable = prctl(PR_GET_DUMPABLE, 0, 0, 0, 0);
- prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- auto guard = make_scope_guard([&]() {
- // restore dumpable
- prctl(PR_SET_DUMPABLE, dumpable, 0, 0, 0);
- });
if (readlink(&proc_self_fd[0], &buf[0], buf.size()) == -1) {
PRINT("readlink('%s') failed: %s [fd=%d]", &proc_self_fd[0], strerror(errno), fd);
return false;
@@ -2285,7 +2288,7 @@
// create anonymous namespace
android_namespace_t* anon_ns =
- create_namespace("(anonymous)", nullptr, anon_ns_library_path, false);
+ create_namespace("(anonymous)", nullptr, anon_ns_library_path, false, nullptr);
if (anon_ns == nullptr) {
g_public_namespace_initialized = false;
@@ -2299,7 +2302,8 @@
android_namespace_t* create_namespace(const char* name,
const char* ld_library_path,
const char* default_library_path,
- bool is_isolated) {
+ bool is_isolated,
+ const char* permitted_when_isolated_path) {
if (!g_public_namespace_initialized) {
DL_ERR("cannot create namespace: public namespace is not initialized.");
return nullptr;
@@ -2308,15 +2312,18 @@
ProtectedDataGuard guard;
std::vector<std::string> ld_library_paths;
std::vector<std::string> default_library_paths;
+ std::vector<std::string> permitted_paths;
parse_path(ld_library_path, ":", &ld_library_paths);
parse_path(default_library_path, ":", &default_library_paths);
+ parse_path(permitted_when_isolated_path, ":", &permitted_paths);
android_namespace_t* ns = new (g_namespace_allocator.alloc()) android_namespace_t();
ns->set_name(name);
ns->set_isolated(is_isolated);
ns->set_ld_library_paths(std::move(ld_library_paths));
ns->set_default_library_paths(std::move(default_library_paths));
+ ns->set_permitted_paths(std::move(permitted_paths));
// TODO(dimtiry): Should this be global group of caller's namespace?
auto global_group = make_global_group(&g_default_namespace);
diff --git a/linker/linker.h b/linker/linker.h
index b391fc3..49329c7 100644
--- a/linker/linker.h
+++ b/linker/linker.h
@@ -446,6 +446,7 @@
bool init_namespaces(const char* public_ns_sonames, const char* anon_ns_library_path);
android_namespace_t* create_namespace(const char* name, const char* ld_library_path,
- const char* default_library_path, bool is_isolated);
+ const char* default_library_path, bool is_isolated,
+ const char* permitted_when_isolated_path);
#endif
diff --git a/linker/linker_utils.cpp b/linker/linker_utils.cpp
index db43d38..1b0c4e4 100644
--- a/linker/linker_utils.cpp
+++ b/linker/linker_utils.cpp
@@ -66,9 +66,18 @@
const char* haystack = file.c_str();
size_t needle_len = strlen(needle);
- return (strncmp(haystack, needle, needle_len) == 0 &&
- haystack[needle_len] == '/' &&
- strchr(haystack + needle_len + 1, '/') == nullptr);
+ return strncmp(haystack, needle, needle_len) == 0 &&
+ haystack[needle_len] == '/' &&
+ strchr(haystack + needle_len + 1, '/') == nullptr;
+}
+
+bool file_is_under_dir(const std::string& file, const std::string& dir) {
+ const char* needle = dir.c_str();
+ const char* haystack = file.c_str();
+ size_t needle_len = strlen(needle);
+
+ return strncmp(haystack, needle, needle_len) == 0 &&
+ haystack[needle_len] == '/';
}
const char* const kZipFileSeparator = "!/";
diff --git a/linker/linker_utils.h b/linker/linker_utils.h
index 65ffbdc5..987eabd 100644
--- a/linker/linker_utils.h
+++ b/linker/linker_utils.h
@@ -22,6 +22,7 @@
bool normalize_path(const char* path, std::string* normalized_path);
bool file_is_in_dir(const std::string& file, const std::string& dir);
+bool file_is_under_dir(const std::string& file, const std::string& dir);
bool parse_zip_path(const char* input_path, std::string* zip_path, std::string* entry_path);
off64_t page_start(off64_t offset);
diff --git a/linker/tests/linker_utils_test.cpp b/linker/tests/linker_utils_test.cpp
index 3be9b3f..fd749fa 100644
--- a/linker/tests/linker_utils_test.cpp
+++ b/linker/tests/linker_utils_test.cpp
@@ -54,6 +54,18 @@
ASSERT_FALSE(file_is_in_dir("/file", "/"));
}
+TEST(linker_utils, file_is_under_dir_smoke) {
+ ASSERT_TRUE(file_is_under_dir("/foo/bar/file", "/foo/bar"));
+ ASSERT_TRUE(file_is_under_dir("/foo/bar/file", "/foo"));
+
+ ASSERT_FALSE(file_is_under_dir("/foo/bar/file", "/bar/foo"));
+
+ ASSERT_TRUE(file_is_under_dir("/file", ""));
+ ASSERT_TRUE(file_is_under_dir("/foo/bar/file", ""));
+ ASSERT_FALSE(file_is_under_dir("/file", "/"));
+ ASSERT_FALSE(file_is_under_dir("/foo/bar/file", "/"));
+}
+
TEST(linker_utils, parse_zip_path_smoke) {
std::string zip_path;
std::string entry_path;
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index 97b5208..5327e36 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -628,10 +628,10 @@
handle_public = dlopen((lib_path + "/public_namespace_libs/" + g_public_lib).c_str(), RTLD_NOW | RTLD_NOLOAD);
ASSERT_TRUE(handle_public != nullptr) << dlerror();
- android_namespace_t* ns1 = android_create_namespace("private", nullptr, (lib_path + "/private_namespace_libs").c_str(), false);
+ android_namespace_t* ns1 = android_create_namespace("private", nullptr, (lib_path + "/private_namespace_libs").c_str(), false, nullptr);
ASSERT_TRUE(ns1 != nullptr) << dlerror();
- android_namespace_t* ns2 = android_create_namespace("private_isolated", nullptr, (lib_path + "/private_namespace_libs").c_str(), true);
+ android_namespace_t* ns2 = android_create_namespace("private_isolated", nullptr, (lib_path + "/private_namespace_libs").c_str(), true, nullptr);
ASSERT_TRUE(ns2 != nullptr) << dlerror();
// This should not have affect search path for default namespace:
@@ -732,13 +732,13 @@
ASSERT_TRUE(android_init_namespaces(path.c_str(), nullptr)) << dlerror();
- android_namespace_t* ns_not_isolated = android_create_namespace("private", nullptr, (lib_path + "/private_namespace_libs").c_str(), false);
+ android_namespace_t* ns_not_isolated = android_create_namespace("private", nullptr, (lib_path + "/private_namespace_libs").c_str(), false, nullptr);
ASSERT_TRUE(ns_not_isolated != nullptr) << dlerror();
- android_namespace_t* ns_isolated = android_create_namespace("private_isolated1", nullptr, (lib_path + "/private_namespace_libs").c_str(), true);
+ android_namespace_t* ns_isolated = android_create_namespace("private_isolated1", nullptr, (lib_path + "/private_namespace_libs").c_str(), true, nullptr);
ASSERT_TRUE(ns_isolated != nullptr) << dlerror();
- android_namespace_t* ns_isolated2 = android_create_namespace("private_isolated2", (lib_path + "/private_namespace_libs").c_str(), nullptr, true);
+ android_namespace_t* ns_isolated2 = android_create_namespace("private_isolated2", (lib_path + "/private_namespace_libs").c_str(), nullptr, true, lib_path.c_str());
ASSERT_TRUE(ns_isolated2 != nullptr) << dlerror();
ASSERT_TRUE(dlopen(root_lib, RTLD_NOW) == nullptr);
@@ -772,14 +772,15 @@
extinfo.library_namespace = ns_isolated2;
+ // this should work because isolation_path for private_isolated2 includes lib_path
handle2 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
- ASSERT_TRUE(handle2 == nullptr);
- ASSERT_STREQ("dlopen failed: library \"libnstest_private_external.so\" not found", dlerror());
+ ASSERT_TRUE(handle2 != nullptr) << dlerror();
+ dlclose(handle2);
// Check dlopen by absolute path
handle2 = android_dlopen_ext(lib_private_external_path.c_str(), RTLD_NOW, &extinfo);
- ASSERT_TRUE(handle2 == nullptr);
- ASSERT_EQ("dlopen failed: library \"" + lib_private_external_path + "\" is not accessible for the namespace \"private_isolated2\"", dlerror());
+ ASSERT_TRUE(handle2 != nullptr) << dlerror();
+ dlclose(handle2);
typedef const char* (*fn_t)();
fn_t ns_get_local_string = reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_local_string"));
@@ -824,7 +825,7 @@
android_namespace_t* ns = android_create_namespace(
"private", nullptr,
(lib_path + "/private_namespace_libs").c_str(),
- false);
+ false, nullptr);
ASSERT_TRUE(ns != nullptr) << dlerror();