2017-04-13 27 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 

被調用的函數,甚至然後必須對執行環境不依賴,因爲它是在主叫方的環境中執行不在於它建於項目你可能如果執行環境是相同的,但是保持這可能是一個問題,那就放棄它。