0


如何实现函数打桩

1、打桩是干什么的?

在对打桩函数本身执行完整的基础上,添加一些额外的代码,完成必要的信息采集,用于具体的问题定位。

2、打桩的时机
程序从诞生到生存分三个阶段,编译,链接和运行
函数分别可以在这三个阶段实现打桩操作

3、打桩的实现

3.1、代码框架

main.c函数调用libmalloc0.so动态库函数,libmalloc1.so调用libmalloc0.so动态库函数

3.2、代码路径

GitHub - dyh-git/func_stub: 函数打桩,重载函数

3.3、具体情况

3.3.1、编译阶段

#define malloc_free_so(size) wrap_malloc_free_so(size)
使用#define完成打桩操作
但是存在个问题,假如#define操作只在malloc_main.c文件中定义,只能在malloc_main.c文件中生效,在其他malloc_else.c文件不能生效

3.3.2、链接阶段

链接插桩依赖于gcc编译器的选项:--wrap func,此选项告诉链接器遇到func符号是解析成__wrap_func,遇到__real_func符号时解析成func。但是代码阅读比较差,容易弄混淆。
假如存在另外一个动态库libmalloc1.so,该动态库调用libmalloc0.so动态库中的malloc_free_so函数。发现libmalloc1.so函数没法实现重载,因为libmalloc1.so可能是第三方提供的,早于你的程序工程编译完。

3.3.3、运行阶段

使用dlopen函数获取动态库中的函数地址,实现行数的打桩
可以对工程其他.c文件以及其他.so完成全方位替换

标签: linux

本文转载自: https://blog.csdn.net/sydyh43/article/details/122587652
版权归原作者 sydyh43 所有, 如有侵权,请联系我们删除。

“如何实现函数打桩”的评论:

还没有评论