2

继上一个问题Using system symbol table from VxWorks RTP之后。

我正在将现有的 vxworks 内核模块移植到 RTP,但是,许多实际功能仍嵌入在其他“可下载”内核模块中。这些是使用 loadModule 加载的(作为启动过程的一部分),因此应该在我的 RTP 运行时的系统符号表中。]

但是,我无法构建我的 RTP,从链接器获取有关未定义引用的错误。

如何说服链接器忽略对这些函数的引用?我将-Xbind-lazy -non-static 选项传递给链接器。

例如,内核模块(构建为 database.out)可能包含如下代码

void writeDatabaseValue(int , char*);

我的 RTP 应用程序代码以通常的方式调用它

void main (int)
{
     //do some stuff
     writeDatabaseValue(0,"foo");  //Linker error here
     taskDelay(100);  //but no linker error here
}

我尝试database.out使用 将引用添加到链接行-l:database.out,这解决了对 writeDatabaseValue 的引用,但是然后我进入了依赖地狱,因为链接器然后尝试解析所有database.outs 引用,包括所有标准的 vxworks api 调用。

编辑:只是为了增加复杂性,我想调用的一些内核模块代码位于实际产生我的 RTP 的同一模块中......

4

1 回答 1

2

您确实是在尝试将一个环境硬塞到一个完全不同的环境中,并且正在经历这种方法所固有的痛苦。我不相信您将能够让链接器忽略引用。

使用符号链接(可从 Workbench 环境中获得)到源文件并在 RTP 项目中使用这些文件可能会更好。

或者基于 DKM 创建动态库(同样,使用符号链接)并将它们链接到您的 RTP。

例如,假设您有以下 Workbench 工作区: DKM1 DKM2 RTP

根据这个问题,您正试图在 RTP 中链接 DKM1 和 2 的目标文件并且遇到了痛苦。

更好的方法是在 DKM1 和 DKM2 中的源文件中添加项目链接,并在 RTP 中编译它们。因为它是一个链接(而不是副本),所以在 DKM 中更改文件(例如修复错误)也会在 RTP 中更改它。

在 RTP 项目中,执行“新建 > 目录”。选择“高级”按钮并选中“链接到现有目录”,然后选择“DKM1”目录。DKM1 中的所有源文件现在都将成为 RTP 的一部分。对 DKM2 执行相同的操作。

当你编译 RTP 项目时,这些新文件也应该被编译。

于 2013-11-08T19:37:06.307 回答