我已经连接了我自己的fopen函数,该函数通过dlsym调用fopen。该函数执行后进程挂起。已经在互联网上搜索,无法获得更多相关信息。将打印件放在代码中并在函数返回期间挂起。
FILE *mfopen(const char *pathname, const char *mode){
FILE * (*dfopen)(const char *, const char *);
void *handle;
FILE *fp;
char *error;
printf("dlopen function \n");
handle = dlopen ("/lib32/libc.so.6", RTLD_NOW);
if(!handle){
printf("Unable to open -->fopen library \n");
printf("fopen error = %s \n",dlerror());
return NULL;
}
printf("dlsym call \n");
//dfopen = dlsym(RTLD_NEXT,"fopen");
dfopen = dlsym(handle,"fopen");
if((error = dlerror()) != NULL){
printf("fopen failure \n");
return NULL;
}
dlclose(handle);
printf("fopen call \n");
fp = (*dfopen)(pathname,mode);
printf("return call \n");
return fp;
}
输出
dlsym call
fopen call
return call
***
答案 0 :(得分:3)
在您的代码中,您在dlsym之后立即调用dlclose,然后尝试在dlsym返回的地址处调用该函数。这是不正确的,并导致问题。
当你执行dlclose时,操作系统很可能会从内存中删除共享库,并且从dlsym返回的地址可能不再处于活动状态,除非有其他dlopen激活库,导致操作系统将库保存在内存中。
然而,只有在完成从dlsym退回的地址上的所有工作完成并且你没有与该库有任何关系之后,最好遵循调用dlclose的做法。