原项目工程采用ARMCC工具链,由于涉及GCC库的问题,改用GCC工具,然而出现了很多前多未有的问题存在,任务堆栈溢出、内存越界等。sscanf导致内存越界也是其中一个。
--wrap=symbol
对symbol进行封装,对symbol的任意定义引用将被解析为__wrap_symbol
。__real_
对symbol的任何未定义引用解析为symbol
。这可用于为系统函数提供封装器。封装函数应该为__wrap_symbol
。如果想调用系统函数,则应该调用__real_symbol
。
GCC的--wrap是一个链接器选项,假如我们要编译的源文件为main.c,编译命令如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void* __wrap_malloc(size_t size)
{
printf("call __wrap_malloc , size %ld \n", size);
return __real_malloc(size);
}
void main(void)
{
char* tmp = NULL;
tmp = (char*)malloc(10);
if (tmp)
{
printf("free...\n");
free(tmp);
}
}
gcc main.c -Wl,--wrap=malloc -o main
./main
call __wrap_malloc , size 10
free...
具体用法参考以下链接:
https://sourceware.org/binutils/docs-2.22/ld/Options.html#Options