在无法修改现有符号的情况下,可以使用特殊模式。
现有符号无法修改,例如,如果它位于外部库或ROM代码中。 在这种情况下,您可以使用$Super$$
和$Sub$$
模式来修补现有符号。
修补函数foo()的定义:
$Super$$
foo
标识原始未修补的函数foo()。 用它来直接调用原始函数。$Sub$$
foo
标识调用的新函数而不是原始函数foo()。 用它来添加在原始功能之前或之后处理。
注意$Super$$
和$Sub$$
机制仅适用于静态链接时,$Super$$
引用不能导入或导出到动态符号表中。
例
以下示例显示如何使用$Super$$
和$Sub$$
插入对函数的调用
在调用遗留函数foo()之前的ExtraFunc()。
extern void ExtraFunc(void); extern void $Super$$foo(void):
/* this function is called instead of the original foo() */
void $Sub$$foo(void)
{
ExtraFunc(); /* does some extra setup work */
$Super$$foo(); /* calls the original foo() function */
/* To avoid calling the original foo() function
* omit the $Super$$foo(); function call.
*/
}