使用dlopen获取libc内存分配函数的句柄

使用dlopen获取libc内存分配函数的句柄,c,linux,memory-management,dlopen,C,Linux,Memory Management,Dlopen,有人能帮我知道如何使用dlopen来处理libc内存分配函数吗?特别是搜索libc路径,然后获取句柄。应该使用什么模式来调用dlsym 这个想法是: 1) 搜索libc路径 2) 在上面调用dlopen 3) 使用dlsym访问内存功能(malloc、calloc等)和 4) 使用函数 请帮助我完成上述4个步骤的代码片段 谢谢你的建议。这里有一个代码片段,HTH #include <dlfcn.h> #include <stdio.h> int main() {

有人能帮我知道如何使用dlopen来处理libc内存分配函数吗?特别是搜索libc路径,然后获取句柄。应该使用什么模式来调用dlsym

这个想法是: 1) 搜索libc路径 2) 在上面调用dlopen 3) 使用dlsym访问内存功能(malloc、calloc等)和 4) 使用函数

请帮助我完成上述4个步骤的代码片段


谢谢你的建议。

这里有一个代码片段,HTH

#include <dlfcn.h>
#include <stdio.h>
int main()
{  
   void *handle; 

   // dlopen will search the path for you
   // /usr/lib/libc.so is a linker script, not an elf file
   // so it won't work with dlopen. 
   handle = dlopen("libc.so.6", RTLD_LAZY); 

   if(handle){
         void* (*mallocptr)(size_t);
         void (*freeptr)(void*);

         // Locate symbols
         *(void**)(&mallocptr) = dlsym(handle, "malloc");
         *(void**)(&freeptr) = dlsym(handle, "free");

         if(!mallocptr || !freeptr){
            printf("%s\n", dlerror());
            return 1;
         }

         // Allocate and use memory
         char *ptr = (*mallocptr)(4);
         ptr[0] = 'H'; ptr[1] = 'i'; ptr[2] = '\n'; ptr[3] = '\0';
         printf(ptr);

         // Free it
         (*freeptr)(ptr);
   }
   else{
      printf("%s\n", dlerror());
      return 1;
   }
   return 0;
}
#包括
#包括
int main()
{  
无效*手柄;
//dlopen将为您搜索路径
///usr/lib/libc.so是链接器脚本,而不是elf文件
//所以它对dlopen不起作用。
handle=dlopen(“libc.so.6”,RTLD_-LAZY);
if(句柄){
空隙*(*mallocptr)(尺寸t);
无效(*freeptr)(无效*);
//定位符号
*(void**)(&mallocptr)=dlsym(手柄,“malloc”);
*(void**)(&freeptr)=dlsym(手柄,“自由”);
如果(!mallocptr | |!freeptr){
printf(“%s\n”,dlerror());
返回1;
}
//分配和使用内存
char*ptr=(*mallocptr)(4);
ptr[0]='H';ptr[1]='i';ptr[2]='\n';ptr[3]='\0';
printf(ptr);
//释放它
(*freeptr)(ptr);
}
否则{
printf(“%s\n”,dlerror());
返回1;
}
返回0;
}

这是一段代码片段,HTH

#include <dlfcn.h>
#include <stdio.h>
int main()
{  
   void *handle; 

   // dlopen will search the path for you
   // /usr/lib/libc.so is a linker script, not an elf file
   // so it won't work with dlopen. 
   handle = dlopen("libc.so.6", RTLD_LAZY); 

   if(handle){
         void* (*mallocptr)(size_t);
         void (*freeptr)(void*);

         // Locate symbols
         *(void**)(&mallocptr) = dlsym(handle, "malloc");
         *(void**)(&freeptr) = dlsym(handle, "free");

         if(!mallocptr || !freeptr){
            printf("%s\n", dlerror());
            return 1;
         }

         // Allocate and use memory
         char *ptr = (*mallocptr)(4);
         ptr[0] = 'H'; ptr[1] = 'i'; ptr[2] = '\n'; ptr[3] = '\0';
         printf(ptr);

         // Free it
         (*freeptr)(ptr);
   }
   else{
      printf("%s\n", dlerror());
      return 1;
   }
   return 0;
}
#包括
#包括
int main()
{  
无效*手柄;
//dlopen将为您搜索路径
///usr/lib/libc.so是链接器脚本,而不是elf文件
//所以它对dlopen不起作用。
handle=dlopen(“libc.so.6”,RTLD_-LAZY);
if(句柄){
空隙*(*mallocptr)(尺寸t);
无效(*freeptr)(无效*);
//定位符号
*(void**)(&mallocptr)=dlsym(手柄,“malloc”);
*(void**)(&freeptr)=dlsym(手柄,“自由”);
如果(!mallocptr | |!freeptr){
printf(“%s\n”,dlerror());
返回1;
}
//分配和使用内存
char*ptr=(*mallocptr)(4);
ptr[0]='H';ptr[1]='i';ptr[2]='\n';ptr[3]='\0';
printf(ptr);
//释放它
(*freeptr)(ptr);
}
否则{
printf(“%s\n”,dlerror());
返回1;
}
返回0;
}

-bash-3.2#/a.out dlopen失败请注意,我在代码中使用的是libc.so.6-如果您使用的是不同版本的libc,则必须对其进行更改。看看你的/lib文件夹,有一个名为libc.so的文件吗?我有libc.so.6,我已经导出了它…不知道为什么dlopen仍然失败。我的意思是它被导出到LD_LIBRARY_路径中。你修改了我发布的代码了吗?消息“dlopen failed”是由dlerror生成的吗?-bash-3.2#/a.out dlopen failed注意,我使用的是libc.so.6,在我的代码中-如果您使用的是不同版本的libc,您必须更改它。看看你的/lib文件夹,有一个名为libc.so的文件吗?我有libc.so.6,我已经导出了它…不知道为什么dlopen仍然失败。我的意思是它被导出到LD_LIBRARY_路径中。你修改了我发布的代码了吗?消息“dlopen failed”是否由dlerror生成?