[英]How to share functions symbols and addresses between projects in C?
我有两个不同的项目在同一个目标上运行。 我希望我的第二个项目在特定地址使用第一个项目中编写的几个函数。
为此,我认为我可以在第二个项目中使用第一个项目中的符号表,但它不起作用。 (我在 .elf 文件上使用 arm-none-eabi 工具链和 -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以指示拇指模式。
例如:
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
被调用的函数甚至必须不依赖于执行环境,因为它是在调用者的环境中执行的,而不是它内置的项目。可能是个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.