C 从钩子函数挂起返回
我已经挂接了我自己的fopen函数,该函数通过dlsym调用fopen。该函数执行后进程将挂起。我一直在internet上搜索,无法获得有关此函数的详细信息。在代码中输入了指纹,在函数返回过程中出现了挂起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;
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,它们不会合作)