连结器双重重新导向(IAR EWARM)

时间:2019-06-03 02:03:49

标签: linker arm stm32 iar

我有一个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

是否可以使用链接器执行此操作?

1 个答案:

答案 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 */
}