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

How to share functions symbols and addresses between projects in C?

我有两个不同的项目,它们 运行 在同一个目标上。 我希望我的第二个项目在特定地址使用第一个项目中编写的几个函数。

为此,我认为我可以在第二个项目中使用第一个项目中的符号 table,但它不起作用。 (我在 .elf 文件上使用 arm-none-eabi 工具链和 -nm 来生成符号 table)。

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

好吧,蛮力方法很可能会奏效:

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

far_function(1, 2, 3);

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

如果地址不为人所知(如果其他应用程序已重新构建并且您没有采取措施 "lock" 将目标函数指向特定地址,则不会为人所知) ,我会改为在包含指针的某个固定地址添加元数据。其他应用程序将嵌入此数据,从而 "exporting" 感兴趣函数的位置。

nm 产生的地址是符号的位置,但在使用 Thumb2 指令集的 Cortex-M 上,这些地址不能直接用于 jump/call/branch 执行 - 需要设置 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

被调用的函数甚至必须不依赖于执行环境,因为它是在调用者的环境中执行的,而不是它所构建的项目的环境。如果执行环境是相同但保持不变可能是个问题。