原项目工程采用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