我有两个不同的项目在同一个目标上运行。我希望我的第二个项目在特定地址使用第一个项目中编写的几个函数。
为此,我认为我可以在第二个项目中使用第一个项目中的符号表,但它不起作用。(我在 .elf 文件上使用 arm-none-eabi 工具链和 -nm 来生成符号表)。
我知道这是可能的,但我该怎么做?
我有两个不同的项目在同一个目标上运行。我希望我的第二个项目在特定地址使用第一个项目中编写的几个函数。
为此,我认为我可以在第二个项目中使用第一个项目中的符号表,但它不起作用。(我在 .elf 文件上使用 arm-none-eabi 工具链和 -nm 来生成符号表)。
我知道这是可能的,但我该怎么做?
好吧,蛮力方法很可能会奏效:
int (*far_function)(int a, int b, int c) = (int(*)(int, int, int)) 0xfeedf00d;
far_function(1, 2, 3);
换句话说,只需创建一个函数指针并使用已知地址对其进行初始化。
如果地址不是众所周知的(如果重新构建其他应用程序并且您没有采取措施将目标函数“锁定”到特定地址,则不会是众所周知的),我会改为添加 meta-包含指针的某个固定地址的数据。另一个应用程序将嵌入此数据,从而“导出”感兴趣函数的位置。
nm 产生的地址是符号的位置,但在使用 Thumb2 指令集的 Cortex-M 上,这些地址不能直接用于跳转/调用/分支执行 - 必须将地址的 LSB 设置为 1指示拇指模式。
例如:
typedef void (*voidFn_void_t)(void) ;
uint32_t symbol_address = symbolLookup( "myfunction" ) ;
symbol_address |= 1 ; // Make Thumb mode address
((voidFn_void_t)symbol_address)() ; // Make call
被调用的函数甚至必须不依赖于执行环境,因为它是在调用者的环境中执行的,而不是在它所构建的项目的环境中执行。如果执行环境相同但保持不变,你可能会逃脱它可能是个问题。