在我的arm动态加载实验中需要解决一个模块调用系统函数的问题,可以使用以下的一个方法。将系统函数固定在某一段地址空间,然后导出这一块的符号表到符号文件中,要记载的模块link的时候使用这个符号表文件,即可以实现模块调用系统函数的问题。
在stm32上做了以下实验,kernel导出一个系统函数void syscall_printf(void),然后模块调用。
syscall.c #include <stdio.h>
void syscall_printf(void)
{
printf(“syscall_printf.\n”); }
链接生成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文件作为输入文件参与链接过程即可。
参照这个方法,可以在一个固定地址空间存放系统函数,然后做成一个系统函数表,生成相应的符号给到模块使用即可。