在我的arm動態加載實驗中需要解決一個模塊調用系統函數的問題,可以使用以下的一個方法。將系統函數固定在某一段地址空間,然后導出這一塊的符號表到符號文件中,要記載的模塊link的時候使用這個符號表文件,即可以實現模塊調用系統函數的問題。
在stm32上做了以下實驗,kernel導出一個系統函數void syscall_printf(void),然后模塊調用。
1 syscall.c 2 3 #include <stdio.h> 4 void syscall_printf(void) 5 { 6 printf(“syscall_printf.\n”); 7 8 }
鏈接生成kernel的時候指定
--keep=syscall_printf保證在kernel沒有使用syscall時候,link不刪除syscall_printf函數。
--symdefs=syscall.sym 生成syscall.sym供模塊鏈接使用。
有關映像符號使用請參照arm官方文檔DUI0206IC_rvct_link_user_guide.pdf。生成的syscall.sym文件實際上是一個文本文件,里面包含了符號信息,比如函數名及地址,全局變量名及地址等,將syscall.sym不需要導出給模塊使用的符號信息刪除掉。
在模塊中可以直接調用syscall_printf,只需在鏈接的時候將syscall.sym文件作為輸入文件參與鏈接過程即可。
參照這個方法,可以在一個固定地址空間存放系統函數,然后做成一個系統函數表,生成相應的符號給到模塊使用即可。