2017-04-13 28 views
1

我有两个不同的项目在同一个目标上运行。 我希望我的第二个项目使用在特定地址的第一个项目中编写的少量函数。如何在C中的项目之间共享函数符号和地址?

要做到这一点,我想我可以使用符号表从第二的第一个项目,但它不工作。 (我在.elf文件中使用arm-none-eabi toolchain和-nm生成符号表)。

我知道这是可能的,但我怎么能做到这一点?

+1

* ...但它不起作用... *这完全解释了问题。 –

+0

我打算假定您使用的是Cortex-M,因为这是CooCox支持的 - 不是最有用的标签 - 目标信息比开发平台更有用。 – Clifford

+0

显示发出呼叫的代码(不起作用的代码),指示正在使用的地址,标记或声明目标平台。您将以这种方式获得更快,更准确,更相关的答案。 – Clifford

回答

1

好,蛮力的办法很可能会工作:

int (*far_function)(int a, int b, int c) = (int(*)(int, int, int)) 0xfeedf00d; 

far_function(1, 2, 3); 

换句话说,只是做一个函数指针,并使用已知的地址初始化。

如果地址不知名的(它不会,如果其他应用程序正在重新修建和你有没有采取措施来“锁定”目标函数,以一个特定的地址),我会而是在包含指针的某个固定地址添加元数据。另一个应用程序会嵌入这些数据,从而“导出”有趣功能的位置。

+0

您是否仅使用'0xfeedf00d',因为它很有趣,或者因为它是一个奇数值,它是有效的ARM-Thumb2分支地址? ;-) – Clifford

+0

@Clifford主要是前者,我想过有人抱怨说这很奇怪,并准备了Thumb2防御。 :)不知道OP的平台。 – unwind

+0

@unwind感谢您的快速回答,它似乎按照我的预期工作。我的平台是Cortex-M3(STM32L151) – LOSwy

0

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 

被调用的函数,甚至然后必须对执行环境不依赖,因为它是在主叫方的环境中执行不在于它建于项目你可能如果执行环境是相同的,但是保持这可能是一个问题,那就放弃它。