开发中,难免会遇到只有库没有源码的情况,调试的时候,库里的几个函数又非常关键,那我们怎么控制里面的流程呢,并插入自己代码?
这个时候就需要使用 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.a
为lib_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
。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!