target:mock(main.c(,未修改任何原始文件(work.a(
objcopy-work.a--添加符号_real_test1=.text:000000000000 126ed,weak--弱化工作.a
00000000000 126ed是通过命令测试1地址(nm工作.a(
重写函数并在没有原始文件的情况下调用main.c中的实际函数
它可以工作
#工作。
void test1(){
printf("old");
}
void test2(){
test1();
}
#main.c
int real_flag=0;
void test1(){
if(real_flag){
_real_test1();
}else{
printf("new");
}
}
int main(){
test2();//print new
real_flag=1;
test2();//print old
}
问题:如何使多个real_function
例如:测试1,__real_test1测试2,__real_test2…
或模拟功能的其他方法
尝试失败
尝试失败:因为它需要修改原始文件工作。
void _real_test1() __attribute__((alias("test1")));
尝试失败:因为它只是修改函数名称,而不是模拟函数
objcopy --redefine-syms
尝试失败:因为它只在main.c中工作,所以它仍然在工作中调用旧的test1。a
gcc -Wl,--wrap=test1
创建mock函数覆盖test1函数
- 命令objcopy使静态库的功能减弱
- 覆盖测试程序中的test1函数
通过共享库加载实函数
- 创建共享库libfunc.so
- dlsym通过函数指针从libfunc.so加载test1您可以调用test1和__real_test1