我有一个现有的项目,最初是作为VxWorks5.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项目编译和链接。
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节)中的应用程序程序员指南中进行了介绍(谢谢@),即使用dlopen()等。如下所示:
void * hdl= dlopen("pathname",RTLD_NOW);
FUNCPTR func = dlsym(hdl,"FunctionName");
func();然而,即使我指定了编译器的非静态的-Xbind-惰性-非静态,我仍然会在链接器中结束。
undefined reference to `_rtld_dlopen'
undefined reference to `_rtld_dlsym'发布于 2015-01-29 11:55:39
这里的问题是,文档中说要指定-Xbind-惰性和-非静态作为编译器选项。但是,实际上应该将它们添加到链接器选项中。
对于适当的构建目标,libc.so.1需要在目标上满足运行时链接要求。
https://stackoverflow.com/questions/19812080
复制相似问题