我有一个现有项目,最初是作为 Vxworks 5.5 风格的内核模块实现的。
该项目创建了许多充当“主机”来运行外部代码的任务。我们做这样的事情:
void loadAndRun(char* file, char* function)
{
//load the module
int fd = open (file, O_RDONLY,0644);
loadModule(fdx, LOAD_ALL_SYMBOLS);
SYM_TYPE type;
FUNCPTR func;
symFindByName(sysSymTbl, &function , (char**) &func, &type);
while (true)
{
func();
}
}
这一切都是一个梦想,然而,被调用的函数是不可重入的,全局数据遍布各处等。我们有一个新的要求是能够运行这些外部模块的多个实例,我的第一个想法是使用 vxworks RTP 提供内存隔离。
但是,无论我如何尝试,我都无法说服我的新 RTP 项目编译和链接。
error: 'sysSymTbl' undeclared (first use in this function)
如果我添加正确的包括:
#include <sysSymTbl.h>
我得到:
error: sysSymTbl.h: No such file or directory
如果我只是在外部定义它:
extern SYMTAB_ID sysSymTbl;
我得到:
error: undefined reference to `sysSymTbl'
我什至还没有开始尝试拼接实际的模块加载代码,目前我只想让符号查找工作。
那么,系统符号表是否可以从 VxWorks RTP 应用程序中访问?可以使用moduleLoad吗?
编辑 看来,我正在尝试做的事情已包含在插件部分(V6.8 的第 4.9 节)中的应用程序程序员指南中(感谢@nos),即使用 dlopen() 等。像这样:
void * hdl= dlopen("pathname",RTLD_NOW);
FUNCPTR func = dlsym(hdl,"FunctionName");
func();
但是,即使我将 -Xbind-lazy -non-static 指定给编译器,我仍然会陷入链接器地狱。
undefined reference to `_rtld_dlopen'
undefined reference to `_rtld_dlsym'