簡體   English   中英

如何在 C 中的項目之間共享函數符號和地址?

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

我有兩個不同的項目在同一個目標上運行。 我希望我的第二個項目在特定地址使用第一個項目中編寫的幾個函數。

為此,我認為我可以在第二個項目中使用第一個項目中的符號表,但它不起作用。 (我在 .elf 文件上使用 arm-none-eabi 工具鏈和 -nm 來生成符號表)。

我知道這是可能的,但我該怎么做?

好吧,蠻力方法很可能會奏效:

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

far_function(1, 2, 3);

換句話說,只需創建一個函數指針並使用已知地址對其進行初始化。

如果地址不是眾所周知的(如果其他應用程序被重新構建並且您沒有采取措施將目標函數“鎖定”到特定地址,則不會這樣),我會改為添加元-某個固定地址的數據,其中包含指針。 另一個應用程序將嵌入此數據,從而“導出”感興趣函數的位置。

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

被調用的函數甚至必須不依賴於執行環境,因為它是在調用者的環境中執行的,而不是它內置的項目。可能是個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM