1. 如果你看下各模块下的生成的文件,你会发现so文件都是空的,如pyjnius,jnius.so就是空的
2. 这就奇了怪了,根据我们的知识储备,如果是调用了import jnius,并且jnius不是一个py,pyo或者pyc文件的话,那么python就会从动态库里去找initjnius进行模块的初始化了。
3. 但是现在动态库是空了,这是什么情况?
4. 还记得distribute.sh里的run_biglink吗?
5. 该函数把所有模块的o文件链接到libpymodules.so中
6. 但是python是怎么从里面取出相应的模块进行初始化的呢?
7. 答案在recipes\python\patches\custom-loader.patch里
8. 这是一个对dynload_shlib.c的patch,patch完后,dynload_shlib.c的_PyImport_GetDynLoadFunc就变成:
dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
const char *pathname, FILE *fp)
{
dl_funcptr p;
void *handle;
char funcname[258];
char pathbuf[260];
int dlopenflags=0;
static void *libpymodules = NULL;
void *rv =