替换libc中的内存分配函数

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

摘要:

本文介绍如何替换glibc中的内存分配函数为自定义的内存分配函数的方法,可以方便调试内存分配,和查找内存管理错误而产生的问题。本文并不介绍如何实现内存管理,只是针对如何替换和替换Libc内存管理函数遇到的问题进行分析。

正文:

1. 问题提出

嵌入式Linux平台下开发的项目,通常都是使用glibc提供的内存管理。如果涉及到外购和合作开发,通常得到的都是lib,而这些lib也都是使用glibc进行内存管理。因为大规模操作内存,因此难免会出现内存泄露,访问越界等问题,针对于此很多前辈都开发了不少的检查工具,例如effence, dmalloc等等,这些都是替换掉libc的内存管理函数,以自己特殊的内存管理来查找内存方面引起的问题。同样我们也可以针对自己应用的特点写出内存管理函数并替换掉libc的内存管理函数。

2. 替换函数

实现以下函数来替换掉Libc中原有的内存管理函数如下:

extern “C” void *memalign(size_t align, size_t size)

{

}

extern “C” void *malloc(size_t size)

{

}

extern “C” void free(void *ptr)

{

}

extern “C” void *realloc(void *oldBuf, size_t newSize)

{

}

extern “C” void *calloc(size_t nelem, size_t elsize)

{

}

extern “C” void *valloc (size_t size)

{

}

如果有用到C++实现以下函数:

void *operator new(unsigned int size)

{

}

void operator delete(void *ptr)

{

}

3. 有关问题的解决

在使用动态链接libc的情况下,只用实现章节2中的函数即可。

在使用静态链接libc的情况下,因为malloc, free, realloc, memalign在glibc中没有以WEAK声明,因此静态链接无法替换掉这几个函数,会在链接过程中报重复定义,可采取以下两种方法处理:

a. malloc/free/realloc使用malloc hook的方法,不过这样代码要注意多线程安全

b. 将libc.a内的相关符号转换为weak

  • 找到链接使用的libc
  • ar x libc.a malloc.o            提取malloc.o
  • objcopy –W malloc malloc.o   符号weak
  • objcopy –W free malloc.o
  • objcopy –W realloc malloc.o
  • objcopy –W memalign malloc.o
  • ar –r libc.a malloc.o        将malloc.o替换回libc
  • 使用新的Libc.a进行链接即可

嵌入式上使用交叉编译器ar和objcopy前添加正确的前缀,例如arm-gcc-ar

结束语:

本文提供了在静态编译下libc下替换内存管理函数的方法,方便的替换自己的内存管理.

转载于:https://my.oschina.net/lgl88911/blog/147901

你可能感兴趣的:(替换libc中的内存分配函数)