我有一个IAR STM32项目,我需要用一些自定义逻辑包装库函数。我没有能力重新编译库本身,因此我想做的是创建一个调用原始libfunction_shim
的函数libfunction
。使用--redirect
链接器选项(--redirect libfunction=libfunction_shim
),我可以将对原始函数的调用重定向到垫片,包括库本身内部的调用。但是,我需要从垫片调用原始函数。
如果我添加另一个重定向(--redirect libfunction_original=libfunction
),它最终会将libfunction_original
重定向到libfunction_shim
,而不是原始的libfunction
。我尝试对重定向进行重新排序,但是无论顺序如何,它都可以执行相同的操作。
链接器日志演示了这一点:
Symbol Redirected to Reason
------------- ------ ------
...
libfunction libfunction_shim command line
libfunction_original libfunction_shim command line
我想要什么:
Symbol Redirected to Reason
------------- ------ ------
...
libfunction libfunction_shim command line
libfunction_original libfunction command line
是否可以使用链接器执行此操作?
答案 0 :(得分:2)
使用链接器重定向是不可能的,您必须以特定方式编写shim函数。手册中有完整的描述(8.40.1版的pg 225),但要进行总结:首先,将垫片命名为$sub$$libfunction
,其中libfunction
是要阴影的函数的名称。在垫片内部,您可以使用$super$$libfunction
来调用libfunction
的原始版本。一个最小的示例如下所示。
extern void $Super$$foo(void);
void $Sub$$foo(void)
{
$Super$$foo(); /* calls the original foo() function */
}