【问题标题】:Using system symbol table from VxWorks RTP使用 VxWorks RTP 中的系统符号表
【发布时间】:2013-11-06 12:24:56
【问题描述】:

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

【问题讨论】:

  • 好吧,内核符号表不是afaik。在 RTP 应用程序中可用。不过,在 RTP 应用程序中,您可以创建共享库,并使用 dlopen()/dlsym(),这可能允许您做类似的事情。您确实有 symLib.h 可用,尽管 RTP 应用程序将使用 usr/h/ 目录中的头文件,因此与内核模块使用的头文件不同。
  • @nos 嗯....这可以工作。我不是特别想修改我们正在调用的代码,但这只是我猜想更改构建属性的情况。
  • 虽然我现在得到了对`_rtld_dlopen'的未定义引用:-(
  • 您需要为该 iirc 链接到 libdl。链接器标志 -ldl ,如果您使用的是 gcc 工具链
  • 修复实际上是使用 -Xbind-lazy -non-static 作为 linker 选项,而不是文档所述的 compiler 选项。所以我知道有一些链接,现在就加载插件

标签: vxworks


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2014-08-10
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多