开发中,难免会遇到只有库没有源码的情况,调试的时候,库里的几个函数又非常关键,那我们怎么控制里面的流程呢,并插入自己代码?

这个时候就需要使用 GCC 工具重定义库中的符号,然后在外面包装该函数。

举例

一个库:lib_test.a

库中的函数:void hello_test_lib(void);

现在,我们想把库里面的 hello_test_lib 函数替换为 new_hello_test_lib,需要以下步骤:

  • 复制一份 lib_test.a 为 lib_test_bak.a
arm-none-eabi-objcopy lib_test.a lib_test_bak.a
  • 重定义符号
arm-none-eabi-objcopy --redefine-sym hello_test_lib=new_hello_test_lib lib_test.a lib_test_bak.a
  • 重命名 lib_test_bak.alib_test.a 即可

重定义符号前后的应用差别

重定义符号,其实就是把库里原来的函数名换成新的函数名,所以在函数调用关系上就多了一层。

上面的例子中,原来的调用关系假设如下:

void main(void)
{
    hello_test_lib();
}

那么,重定义符号后,函数调用关系编程了如下所示:

void hello_test_lib(void)
{
    new_hello_test_lib();
}

void main(void)
{
    hello_test_lib();
}

在 main 函数中调用了库里的函数 hello_test_lib,但是库里的函数已经被我们重定义为了 new_hello_test_lib ,所以,调用关系上,需要我们在外部实现一个被替换的原来的函数接口 hello_test_lib


物联网      GCC 库打桩 GCC 符号替换

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

 目录

微信公众号:物联网学前班