摘要:
本文介绍如何替换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下替换内存管理函数的方法,方便的替换自己的内存管理.