链接时打桩

链接时打桩利用链接器的 --wrap 选项,在链接阶段重定向函数调用,无需修改源代码。

原理:链接器在处理包含 --wrap=malloc 选项的链接命令时,会自动将所有对 malloc 的引用重定向到 __wrap_malloc,并将所有对 __real_malloc 的引用重定向到真正的 malloc

工作流程

  1. 编写自定义函数 __wrap_malloc,在其中添加需要的额外逻辑。
  2. 在自定义函数内部,调用 __real_malloc 来获取真正的 malloc 功能。
  3. 链接时加上 -Wl,--wrap,malloc 选项。

代码示例

void *__wrap_malloc(size_t size) {
    printf("malloc(%zu) called\n", size);
    return __real_malloc(size);
}

映射关系

  • malloc() 在你的代码中 → 链接器将其变为 __wrap_malloc() → 调用你的自定义函数
  • __real_malloc() 在你的包装函数中 → 链接器将其变为 malloc() → 调用系统库的真实函数

这种方式不需要修改源代码或使用宏,但需要有链接阶段的控制权。

链接到