0

目标:模拟(main.c)而不修改任何原始文件(work.a)

objcopy work.a --add-symbol _real_test1=.text:00000000000126ed,weak --weaken work.a

00000000000126ed 是命令的 test1 地址 (nm work.a)

在没有原始文件的情况下覆盖函数并在 main.c 中调用真实函数

它可以工作

#work.a

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

例如:test1,__real_test1 test2,__real_test2...

或其他模拟功能的方法

尝试失败

尝试失败:因为它需要修改原始文件work.a

void _real_test1() __attribute__((alias("test1")));

尝试失败:因为它只是修改函数名而不是模拟函数

objcopy --redefine-syms

尝试失败:因为它只在 main.c 中工作,它仍然在 work.a 中调用旧的 test1

gcc -Wl,--wrap=test1
4

1 回答 1

0

创建模拟函数覆盖 test1 函数

  1. 命令 objcopy 使静态库的功能减弱
  2. 在测试程序中覆盖 test1 函数

通过共享库加载真实函数

  1. 制作共享库 libfunc.so
  2. dlsym 通过来自 libfunc.so 的函数指针加载 test1,因此您可以调用 test1 和 __real_test1
于 2020-07-23T09:26:55.090 回答