从钩子函数返回挂起

时间:2017-03-31 11:40:14

标签: c dlsym

我已经连接了我自己的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  
***

1 个答案:

答案 0 :(得分:3)

在您的代码中,您在dlsym之后立即调用dlclose,然后尝试在dlsym返回的地址处调用该函数。这是不正确的,并导致问题。

当你执行dlclose时,操作系统很可能会从内存中删除共享库,并且从dlsym返回的地址可能不再处于活动状态,除非有其他dlopen激活库,导致操作系统将库保存在内存中。

然而,只有在完成从dlsym退回的地址上的所有工作完成并且你没有与该库有任何关系之后,最好遵循调用dlclose的做法。