我有一个现有的项目,最初是作为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:
#include <sysSymTbl.h>
我明白了:
error: sysSymTbl.h: No such file or directory
如果我只是将其定义为extern:
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'
答案 0 :(得分:0)
这里的问题是文档说明将-Xbind-lazy和-non-static指定为编译器选项。但是,这些实际上应该添加到链接器选项。
然后,需要在目标上使用适当的构建目标的libc.so.1来满足运行时链接要求。