如何在C中的项目之间共享函数符号和地址?

时间:2017-04-13 10:18:00

标签: c gcc debug-symbols coocox

我有两个不同的项目在同一个目标上运行。 我希望我的第二个项目在特定地址的第一个项目中使用很少的函数。

为此,我想我可以在第二个项目中使用第一个项目中的符号表,但它不起作用。 (我使用arm-none-eabi toolchain和-nm on .elf文件生成符号表。)

我知道这是可能的,但我该怎么做?

2 个答案:

答案 0 :(得分:1)

蛮力方法很可能会奏效:

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

far_function(1, 2, 3);

换句话说,只需创建一个函数指针并使用已知地址对其进行初始化。

如果地址不是众所周知的(如果其他应用程序重新构建并且您没有采取措施,那么它就不会被锁定"锁定"目标函数到特定地址),我会在一些固定地址添加元数据,包含指针。另一个应用程序将嵌入这些数据,从而导出"导出"有趣功能的位置。

答案 1 :(得分:0)

由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

被调用的函数甚至必须对执行环境没有依赖性,因为它在调用者的环境中执行,而不是在它内置的项目的环境中执行。如果执行环境是相同的,你可能会侥幸逃脱它但保持这可能是一个问题。