IAR 中 C 函数的别名
Alias for a C function in IAR
我需要一个符号 alias
作为函数 function
的别名,如 this question 中所述,但对于 IAR compiler/linker。我已经尝试过 GCC 的答案,但显然这些答案不起作用:
// source code
void alias(void) __attribute__ ((alias ("function")));
Error[Pe130]: expected a "{" C:\project\test.c 61
void alias(void) asm("function");
Error[Pe065]: expected a ";" C:\project\test.c 61
#pragma weak alias=function
Error[e46]: Undefined external "alias" referred in ?ABS_ENTRY_MOD ( )
// linker options:
-Dalias=function
Fatal Error[e163]: The command line symbol "function" in -Dalias=function is not defined.
有谁知道如何在 IAR/Xlink 中定义函数别名?
一点背景知识:我负责一个在多个项目中使用的模块。为了测试它,我为 testIDEA 工具开发了测试用例,该工具在某些断点处验证断言。但是,一些常用函数在不同的项目中有不同的名称(例如初始化函数可以称为init()
,init_mcu()
,startup()
等)所以每次我的模块都集成到一个新项目中,我必须修改我的测试用例以匹配新的函数名称。我想做的是为调用 init 函数的任何对象定义一个通用别名(例如 test_init()
),以便我的测试用例始终可以使用该通用名称设置断点。我希望这个符号能够进入 ELF 文件,调试器可以在其中看到它。
来自 IAR C/C++ Development Guide(第 258 页):
To make the definition of foo
a weak definition, write:
#pragma weak foo
To make NMI_Handler
a weak alias for Default_Handler
, write:
#pragma weak NMI_Handler=Default_Handler
If NMI_Handler
is not defined elsewhere in the program, all references to NMI_Handler
will refer to Default_Handler
.
所以,尝试这样的事情:
void f1(void);
void f2(void);
#pragma weak f1=f2
void f2(void) {}
仔细查看 xlink
options 后,我找到了适合我需要的那个:
-e -enew=old [,old] …
Use -e to configure a program at link time by redirecting a function call from one function to another.
This can also be used for creating stub functions; i.e. when a system is not yet complete, undefined function calls can be directed to a dummy routine until the real function has been written.
我得到了这段代码:
void alias(void) {
// copy the body of function()
}
// Linker parameters
-ealias=function
这会将对 function()
的所有调用重定向到 alias()
,而不管 function
的实际名称。当然这是一个丑陋的 hack,因为我必须复制代码,但我得到了我想要的:我可以按名称将断点设置为 alias()
。
我需要一个符号 alias
作为函数 function
的别名,如 this question 中所述,但对于 IAR compiler/linker。我已经尝试过 GCC 的答案,但显然这些答案不起作用:
// source code
void alias(void) __attribute__ ((alias ("function")));
Error[Pe130]: expected a "{" C:\project\test.c 61
void alias(void) asm("function");
Error[Pe065]: expected a ";" C:\project\test.c 61
#pragma weak alias=function
Error[e46]: Undefined external "alias" referred in ?ABS_ENTRY_MOD ( )
// linker options:
-Dalias=function
Fatal Error[e163]: The command line symbol "function" in -Dalias=function is not defined.
有谁知道如何在 IAR/Xlink 中定义函数别名?
一点背景知识:我负责一个在多个项目中使用的模块。为了测试它,我为 testIDEA 工具开发了测试用例,该工具在某些断点处验证断言。但是,一些常用函数在不同的项目中有不同的名称(例如初始化函数可以称为init()
,init_mcu()
,startup()
等)所以每次我的模块都集成到一个新项目中,我必须修改我的测试用例以匹配新的函数名称。我想做的是为调用 init 函数的任何对象定义一个通用别名(例如 test_init()
),以便我的测试用例始终可以使用该通用名称设置断点。我希望这个符号能够进入 ELF 文件,调试器可以在其中看到它。
来自 IAR C/C++ Development Guide(第 258 页):
To make the definition of
foo
a weak definition, write:
#pragma weak foo
To makeNMI_Handler
a weak alias forDefault_Handler
, write:
#pragma weak NMI_Handler=Default_Handler
IfNMI_Handler
is not defined elsewhere in the program, all references toNMI_Handler
will refer toDefault_Handler
.
所以,尝试这样的事情:
void f1(void);
void f2(void);
#pragma weak f1=f2
void f2(void) {}
仔细查看 xlink
options 后,我找到了适合我需要的那个:
-e -enew=old [,old] …
Use -e to configure a program at link time by redirecting a function call from one function to another.
This can also be used for creating stub functions; i.e. when a system is not yet complete, undefined function calls can be directed to a dummy routine until the real function has been written.
我得到了这段代码:
void alias(void) {
// copy the body of function()
}
// Linker parameters
-ealias=function
这会将对 function()
的所有调用重定向到 alias()
,而不管 function
的实际名称。当然这是一个丑陋的 hack,因为我必须复制代码,但我得到了我想要的:我可以按名称将断点设置为 alias()
。