首页 文章

使用VxWorks RTP中的系统符号表

提问于
浏览
0

我有一个现有的项目,最初实现为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:

extern SYMTAB_ID    sysSymTbl;

我得到:

error: undefined reference to `sysSymTbl'

我甚至没有开始尝试缝合实际的模块加载代码,此刻我只想让符号查找工作 .

那么,系统符号表是否可以从VxWorks RTP应用程序访问?可以使用moduleLoad吗?

EDIT 看起来我正在尝试做的事情在应用程序员指南的插件部分(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'

1 回答

  • 0

    这里的问题是文档说明将-Xbind-lazy和-non-static指定为 compiler 选项 . 但是,这些实际上应该添加到 linker 选项中 .

    然后,在目标上需要libc.so.1以获取适当的构建目标,以满足运行时链接要求 .

相关问题