diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c index 7f8f134..bba560f 100644 --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -62,6 +62,20 @@ _PyImport_FindSharedFuncptr(const char *prefix, char pathbuf[260]; int dlopenflags=0; + static void *libpymodules = NULL; + void *rv = NULL; + + /* Ensure we have access to libpymodules. */ + if (libpymodules == NULL) { + printf("ANDROID_PRIVATE = %s\n", getenv("ANDROID_PRIVATE")); + PyOS_snprintf(pathbuf, sizeof(pathbuf), "%s/libpymodules.so", getenv("ANDROID_PRIVATE")); + libpymodules = dlopen(pathbuf, RTLD_NOW); + + if (libpymodules == NULL) { + //abort(); + } + } + if (strchr(pathname, '/') == NULL) { /* Prefix bare filename with "./" */ PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname); @@ -71,6 +85,16 @@ _PyImport_FindSharedFuncptr(const char *prefix, PyOS_snprintf(funcname, sizeof(funcname), LEAD_UNDERSCORE "%.20s_%.200s", prefix, shortname); + + /* Read symbols that have been linked into the main binary. */ + + if (libpymodules) { + rv = dlsym(libpymodules, funcname); + if (rv != NULL) { + return rv; + } + } + if (fp != NULL) { int i; struct _Py_stat_struct status;