Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从钩子函数挂起返回_C_Dlsym - Fatal编程技术网

C 从钩子函数挂起返回

C 从钩子函数挂起返回,c,dlsym,C,Dlsym,我已经挂接了我自己的fopen函数,该函数通过dlsym调用fopen。该函数执行后进程将挂起。我一直在internet上搜索,无法获得有关此函数的详细信息。在代码中输入了指纹,在函数返回过程中出现了挂起 FILE *mfopen(const char *pathname, const char *mode){ FILE * (*dfopen)(const char *, const char *); void *handle; FILE *fp; char *error;

我已经挂接了我自己的fopen函数,该函数通过dlsym调用fopen。该函数执行后进程将挂起。我一直在internet上搜索,无法获得有关此函数的详细信息。在代码中输入了指纹,在函数返回过程中出现了挂起

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  
***

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

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


不过,最好遵循这样的做法,即只有在完成从dlsym返回的地址的所有工作并且与库没有任何关系后才调用dlclose。

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

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


尽管如此,最好遵循这样的做法,即只有在完成从dlsym返回的地址的所有工作并且您与库没有任何进一步的关系后,才调用dlclose。

我也尝试在返回之前关闭,仍然存在相同的问题,但是,您可能仍然尝试使用“fp”从dlsym返回,基本上来自图书馆。只有在使用“fp”的工作结束并且与lib没有任何进一步的关系时,才应该调用dlclose。我在返回之前也尝试过关闭,仍然存在相同的问题,但是,您可能仍然尝试使用从dlsym返回的“fp”,它基本上来自库。只有在使用“fp”的工作也完成并且与lib没有任何进一步的关系时,才应该调用dlclose。调用函数中可能存在问题,您没有引用该函数。此外,您还可以尝试选项RTLD_NOLOAD——为了安全起见(您不需要两个不同的libc,它们不会合作)。调用函数中可能存在问题,您没有引用。您也可以尝试RTLD_NOLOAD选项——只是为了安全(您不需要两个不同的libc,它们不会合作)