如何实现函数打桩

如何实现函数打桩

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完成全方位替换

相关推荐

卡塔尔世界杯正赛臂章,卡塔尔世界杯参赛队 365有没有反水的

卡塔尔世界杯正赛臂章,卡塔尔世界杯参赛队

📅 08-04 👁️ 364
皇的成语 365有没有反水的

皇的成语

📅 07-17 👁️ 133
16g内存卡 365有没有反水的

16g内存卡

📅 07-23 👁️ 558