[VxWorks] vxworks模块加载

feigou   2008-12-29 10:40 楼主
我用Tornado2.2(vxworks5.5),在虚拟机上建立文件系统FAT16格式,通过ftp从windows向目标机vxworks传递应用模块api.o,文件 可以用ls查看到,在目标机sell上运行ld(1,0,"C:/api.o"),报错"error loading,errno=0x3d0001".该文件在Tornado用target server加载可以成功运行.
api.c内容如下
#include
#include
void test()
{
pritf("welcome!");
}
然后工程中添加ldtest.c,内容主要如下
/* 打开第一个可执行文件位于ram0 */
fd = open("ram0/myapp.out", O_RDONLY, 0);
if(fd == ERROR) {
printf("Can not open application program file. \n\r") ;
return(ERROR);
} else {
printf("Application program file opened. \n\r") ;
}

/* 加载模块 */
printf("Autoload application model...\n");
if((hModule = loadModule(fd, LOAD_ALL_SYMBOLS)) == NULL) {
close(fd);
printf("LoadModule for application is error = 0x%x. \n\r", errno);
return(ERROR);
}
close(fd);

文件打开不报错,但在loadModule中报错,用errno为S_objLib_OBJ_ID_ERROR,查看源码在/target/h/objLib.h中代码
#define OBJ_VERIFY(objId,classId)                                         \
    (                                                                    \
      (                                                                         \
      (((OBJ_ID)(objId))->pObjClass == (struct obj_class *)(classId)) || \
       (                                                                 \
       ((OBJ_ID)(objId))->pObjClass &&                                         \
         (((OBJ_ID)(objId))->pObjClass ==                                \
        (CLASS_ID)(((struct obj_class *)(classId))->initRtn))                   \
       )                                                                 \
      )                                                                  \
        ?                                                                \
            OK                                                           \
        :                                                                \
            (errno = S_objLib_OBJ_ID_ERROR, ERROR)                       \
经过我测试发现错出在(((OBJ_ID)(objId))->pObjClass ==                                \
        (CLASS_ID)(((struct obj_class *)(classId))->initRtn)) 上,这一行代码看不懂.
谁能指导我一下可能错出在那一方面上?怎么解决?不胜感激.

回复评论 (6)

自己顶一下,有人能指导一下吗?
那行代码怎么解释?模块的编译需要有什么设置吗?
点赞  2008-12-30 10:59
什么平台?tornado补丁打过没有?
我在PPC上这样用都是正常的
点赞  2008-12-30 13:49
[code]
/******************************************************************************
函数名:     runDynamicLoadFunc
描述:       运行动态加载的模块函数
调用:      
被调用:     
输入参数:   moduleName模块名称 funcName函数名称
输出参数:   无
返回:       0正确 -1输入名称错误 -2文件系统中找不到该模块 -3模块中找不到该函数
说明:      
******************************************************************************/
int runDynamicLoadFunc(char * moduleName, char * funcName)
{
    SYM_TYPE * pType;
    FUNCPTR pFunc;

    MODULE_ID moduleId;

    if(NULL == moduleName || NULL == funcName )
    {
        return -1;
    }

    moduleId = ld(1, TRUE, moduleName);
    if(NULL == moduleId)
    {
        printf("load %s module error\n", moduleName);
        return -2;
    }

    if(ERROR == symFindByName(sysSymTbl, funcName, (char**)&pFunc, pType))
    {
        printf("find %s symbol error\n", funcName);
        return -3;
    }
    else
    {
        (*pFunc)();
    }

    return 0;
}
点赞  2008-12-30 13:53
这是我用的一个动态加载函数
点赞  2008-12-30 13:53
ld(1,0,"C:/api.o"),这个有问题,路径不对。这个c:/api.o不认识的。
点赞  2009-1-14 22:39
to frank_zhou:我加了文件系统,有才c:/
to leifeng281:我现在用workbench的simulation可以没问题,估计tornado有问题,没打过补丁,不知道和动态加载有关系啊
不管怎么样,多谢了
点赞  2009-1-24 15:36
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复