Linux GCC查漏补缺

1、gcc -Wl,--wrap,function

-Wl表示将参数传递给ld链接器,--wrap,function或者--wrap=function,此选项可以替换标准库函数,实现不改变原有库的情况下,使用新实现替换原有库函数。

Example:

#include<stdio.h>
#include<stdlib.h>

void* __real_malloc(size_t size); // 只声明不定义__real_malloc
void* __wrap_malloc(size_t size) // 定义__wrap_malloc
{
    printf("__wrap_malloc called, size:%d\n", size); // log输出
    return __real_malloc(size); // 通过__real_malloc调用真正的malloc
}

int main(void)
{
    void* mem=malloc(10);
}

输出:

d:\VScode\.vscode>gcc wrap_test.c -o wrap_test -Wl,--wrap,malloc

d:\VScode\.vscode>wrap_test.exe
__wrap_malloc called, size:16
__wrap_malloc called, size:14
__wrap_malloc called, size:10

2, --start-group和--end-group

编译的时候出现了一个问题,对于静态包(.a)链接的时候,如果出现后面的包依赖前面的包的情况,则会报undefined reference,

例如:

#liba.a引用了libb.a的函数
gcc hello.c -o hello libb.a liba.a
#liba.a无法找到libb.a的引用

这个时候使用--start-group  liba.a libb.a --end-group,链接器会在start和end之间循环查找引用。

gcc hello.c -o hello --start-group  libb.a liba.a --end-group

 

3,GCC的默认参数

如果不带-c,不带-o,则默认为-o a.out,也就是既编译又链接。编译阶段不检查全局符号是否存在定义。


版权声明:本文为xiaoshixiu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。