diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2017-04-07 21:46:14 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-04-07 21:46:18 +0000 |
commit | 1238292db5031fdf0cfe9e753265c30a46a21ec3 (patch) | |
tree | 7bf744cb5b457cf2fed14e08c823727b8d944e3e /include | |
parent | f8111b7df86a4678748d484e7292a52b0c2a7769 (diff) | |
parent | e8fb11dfa1b376124d0a1a349c8800799f25606a (diff) | |
download | core-1238292db5031fdf0cfe9e753265c30a46a21ec3.tar.gz |
Merge "NativeBridge: add "linked namespace" semantic corresponding to linker"
Diffstat (limited to 'include')
-rw-r--r-- | include/nativebridge/native_bridge.h | 106 |
1 files changed, 74 insertions, 32 deletions
diff --git a/include/nativebridge/native_bridge.h b/include/nativebridge/native_bridge.h index 45266dedf..929b8aec4 100644 --- a/include/nativebridge/native_bridge.h +++ b/include/nativebridge/native_bridge.h @@ -116,14 +116,25 @@ struct native_bridge_namespace_t; // Use NativeBridgeIsSupported() instead in non-namespace scenario. bool NativeBridgeIsPathSupported(const char* path); -// Initializes public and anonymous namespace at native bridge side. +// Initializes anonymous namespace. +// NativeBridge's peer of android_init_anonymous_namespace() of dynamic linker. +// +// The anonymous namespace is used in the case when a NativeBridge implementation +// cannot identify the caller of dlopen/dlsym which happens for the code not loaded +// by dynamic linker; for example calls from the mono-compiled code. // // Starting with v3, NativeBridge has two scenarios: with/without namespace. // Should not use in non-namespace scenario. -bool NativeBridgeInitNamespace(const char* public_ns_sonames, - const char* anon_ns_library_path); +bool NativeBridgeInitAnonymousNamespace(const char* public_ns_sonames, + const char* anon_ns_library_path); -// Create a namespace and pass the key of related namespaces to native bridge. +// Create new namespace in which native libraries will be loaded. +// NativeBridge's peer of android_create_namespace() of dynamic linker. +// +// The libraries in the namespace are searched by folowing order: +// 1. ld_library_path (Think of this as namespace-local LD_LIBRARY_PATH) +// 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) // // Starting with v3, NativeBridge has two scenarios: with/without namespace. // Should not use in non-namespace scenario. @@ -134,7 +145,17 @@ native_bridge_namespace_t* NativeBridgeCreateNamespace(const char* name, const char* permitted_when_isolated_path, native_bridge_namespace_t* parent_ns); +// Creates a link which shares some libraries from one namespace to another. +// NativeBridge's peer of android_link_namespaces() of dynamic linker. +// +// Starting with v3, NativeBridge has two scenarios: with/without namespace. +// Should not use in non-namespace scenario. +bool NativeBridgeLinkNamespaces(native_bridge_namespace_t* from, native_bridge_namespace_t* to, + const char* shared_libs_sonames); + // Load a shared library with namespace key that is supported by the native bridge. +// NativeBridge's peer of android_dlopen_ext() of dynamic linker, only supports namespace +// extension. // // Starting with v3, NativeBridge has two scenarios: with/without namespace. // Use NativeBridgeLoadLibrary() instead in non-namespace scenario. @@ -152,7 +173,7 @@ struct NativeBridgeCallbacks { // Parameters: // runtime_cbs [IN] the pointer to NativeBridgeRuntimeCallbacks. // Returns: - // true iff initialization was successful. + // true if initialization was successful. bool (*initialize)(const NativeBridgeRuntimeCallbacks* runtime_cbs, const char* private_dir, const char* instruction_set); @@ -194,10 +215,10 @@ struct NativeBridgeCallbacks { // instruction set. // // Parameters: - // instruction_set [IN] the instruction set of the app + // instruction_set [IN] the instruction set of the app // Returns: - // NULL if not supported by native bridge. - // Otherwise, return all environment values to be set after fork. + // NULL if not supported by native bridge. + // Otherwise, return all environment values to be set after fork. const struct NativeBridgeRuntimeValues* (*getAppEnv)(const char* instruction_set); // Added callbacks in version 2. @@ -206,9 +227,9 @@ struct NativeBridgeCallbacks { // forwards- or backwards-compatible, and libnativebridge will then stop using it. // // Parameters: - // bridge_version [IN] the version of libnativebridge. + // bridge_version [IN] the version of libnativebridge. // Returns: - // true iff the native bridge supports the given version of libnativebridge. + // true if the native bridge supports the given version of libnativebridge. bool (*isCompatibleWith)(uint32_t bridge_version); // A callback to retrieve a native bridge's signal handler for the specified signal. The runtime @@ -217,12 +238,12 @@ struct NativeBridgeCallbacks { // that will potentially lead to cycles. // // Parameters: - // signal [IN] the signal for which the handler is asked for. Currently, only SIGSEGV is + // signal [IN] the signal for which the handler is asked for. Currently, only SIGSEGV is // supported by the runtime. // Returns: - // NULL if the native bridge doesn't use a handler or doesn't want it to be managed by the - // runtime. - // Otherwise, a pointer to the signal handler. + // NULL if the native bridge doesn't use a handler or doesn't want it to be managed by the + // runtime. + // Otherwise, a pointer to the signal handler. NativeBridgeSignalHandlerFn (*getSignalHandler)(int signal); // Added callbacks in version 3. @@ -231,7 +252,7 @@ struct NativeBridgeCallbacks { // to zero then the dynamic library is unloaded. // // Parameters: - // handle [IN] the handler of a dynamic library. + // handle [IN] the handler of a dynamic library. // // Returns: // 0 on success, and nonzero on error. @@ -257,33 +278,36 @@ struct NativeBridgeCallbacks { // Use isSupported instead in non-namespace scenario. bool (*isPathSupported)(const char* library_path); - // Initializes anonymous namespace at native bridge side and pass the key of - // two namespaces(default and anonymous) owned by dynamic linker to native bridge. + // Initializes anonymous namespace at native bridge side. + // NativeBridge's peer of android_init_anonymous_namespace() of dynamic linker. + // + // The anonymous namespace is used in the case when a NativeBridge implementation + // cannot identify the caller of dlopen/dlsym which happens for the code not loaded + // by dynamic linker; for example calls from the mono-compiled code. // // Parameters: - // public_ns_sonames [IN] the name of "public" libraries. - // anon_ns_library_path [IN] the library search path of (anonymous) namespace. + // public_ns_sonames [IN] the name of "public" libraries. + // anon_ns_library_path [IN] the library search path of (anonymous) namespace. // Returns: - // true if the pass is ok. - // Otherwise, false. + // true if the pass is ok. + // Otherwise, false. // // Starting with v3, NativeBridge has two scenarios: with/without namespace. // Should not use in non-namespace scenario. - bool (*initNamespace)(const char* public_ns_sonames, - const char* anon_ns_library_path); - + bool (*initAnonymousNamespace)(const char* public_ns_sonames, const char* anon_ns_library_path); - // Create a namespace and pass the key of releated namespaces to native bridge. + // Create new namespace in which native libraries will be loaded. + // NativeBridge's peer of android_create_namespace() of dynamic linker. // // Parameters: - // name [IN] the name of the namespace. - // ld_library_path [IN] the first set of library search paths of the namespace. - // default_library_path [IN] the second set of library search path of the namespace. - // type [IN] the attribute of the namespace. - // permitted_when_isolated_path [IN] the permitted path for isolated namespace(if it is). - // parent_ns [IN] the pointer of the parent namespace to be inherited from. + // name [IN] the name of the namespace. + // ld_library_path [IN] the first set of library search paths of the namespace. + // default_library_path [IN] the second set of library search path of the namespace. + // type [IN] the attribute of the namespace. + // permitted_when_isolated_path [IN] the permitted path for isolated namespace(if it is). + // parent_ns [IN] the pointer of the parent namespace to be inherited from. // Returns: - // native_bridge_namespace_t* for created namespace or nullptr in the case of error. + // native_bridge_namespace_t* for created namespace or nullptr in the case of error. // // Starting with v3, NativeBridge has two scenarios: with/without namespace. // Should not use in non-namespace scenario. @@ -294,7 +318,25 @@ struct NativeBridgeCallbacks { const char* permitted_when_isolated_path, native_bridge_namespace_t* parent_ns); + // Creates a link which shares some libraries from one namespace to another. + // NativeBridge's peer of android_link_namespaces() of dynamic linker. + // + // Parameters: + // from [IN] the namespace where libraries are accessed. + // to [IN] the namespace where libraries are loaded. + // shared_libs_sonames [IN] the libraries to be shared. + // + // Returns: + // Whether successed or not. + // + // Starting with v3, NativeBridge has two scenarios: with/without namespace. + // Should not use in non-namespace scenario. + bool (*linkNamespaces)(native_bridge_namespace_t* from, native_bridge_namespace_t* to, + const char* shared_libs_sonames); + // Load a shared library within a namespace. + // NativeBridge's peer of android_dlopen_ext() of dynamic linker, only supports namespace + // extension. // // Parameters: // libpath [IN] path to the shared library |