我有两个不同的项目在同一个目标上运行。 我希望我的第二个项目使用在特定地址的第一个项目中编写的少量函数。如何在C中的项目之间共享函数符号和地址?
要做到这一点,我想我可以使用符号表从第二的第一个项目,但它不工作。 (我在.elf文件中使用arm-none-eabi toolchain和-nm生成符号表)。
我知道这是可能的,但我怎么能做到这一点?
我有两个不同的项目在同一个目标上运行。 我希望我的第二个项目使用在特定地址的第一个项目中编写的少量函数。如何在C中的项目之间共享函数符号和地址?
要做到这一点,我想我可以使用符号表从第二的第一个项目,但它不工作。 (我在.elf文件中使用arm-none-eabi toolchain和-nm生成符号表)。
我知道这是可能的,但我怎么能做到这一点?
好,蛮力的办法很可能会工作:
int (*far_function)(int a, int b, int c) = (int(*)(int, int, int)) 0xfeedf00d;
far_function(1, 2, 3);
换句话说,只是做一个函数指针,并使用已知的地址初始化。
如果地址不知名的(它不会,如果其他应用程序正在重新修建和你有没有采取措施来“锁定”目标函数,以一个特定的地址),我会而是在包含指针的某个固定地址添加元数据。另一个应用程序会嵌入这些数据,从而“导出”有趣功能的位置。
nm产生的地址是符号的位置,但在使用Thumb2指令集的Cortex-M上,这些地址不能直接用于跳转/调用/分支执行 - 必须将LSB设置为地址为1以指示Thumb模式。
例如:
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
被调用的函数,甚至然后必须对执行环境不依赖,因为它是在主叫方的环境中执行不在于它建于项目你可能如果执行环境是相同的,但是保持这可能是一个问题,那就放弃它。
* ...但它不起作用... *这完全解释了问题。 –
我打算假定您使用的是Cortex-M,因为这是CooCox支持的 - 不是最有用的标签 - 目标信息比开发平台更有用。 – Clifford
显示发出呼叫的代码(不起作用的代码),指示正在使用的地址,标记或声明目标平台。您将以这种方式获得更快,更准确,更相关的答案。 – Clifford