我有两个不同的项目在同一个目标上运行。 我希望我的第二个项目在特定地址的第一个项目中使用很少的函数。
为此,我想我可以在第二个项目中使用第一个项目中的符号表,但它不起作用。 (我使用arm-none-eabi toolchain和-nm on .elf文件生成符号表。)
我知道这是可能的,但我该怎么做?
答案 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
被调用的函数甚至必须对执行环境没有依赖性,因为它在调用者的环境中执行,而不是在它内置的项目的环境中执行。如果执行环境是相同的,你可能会侥幸逃脱它但保持这可能是一个问题。