从上一个问题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
}我曾尝试使用-l:database.out将database.out添加到链接行,它解析了对writeDatabaseValue的引用,但是我随后陷入了依赖地狱,因为链接器随后会尝试解析所有database.out的引用,包括所有标准的vxworks api调用。
编辑:只是为了更复杂,我想调用的一些内核模块代码与实际产生我的RTP的模块位于同一个模块中……
发布于 2013-11-09 03:37:06
您实际上是在试图将一个环境硬塞到一个完全不同的环境中,并且正在经历这种方法所固有的痛苦。我不相信你能让链接器忽略引用。
使用符号链接(在Workbench环境中可用)到源文件并在RTP项目中使用它们可能会更好。
或者基于DKMs创建动态库(同样,使用符号链接),并将它们链接到您的RTP。
例如,假设您有以下工作台工作区: DKM1 DKM2 RTP
基于这个问题,您正在尝试在RTP中链接DKM1 &2的目标文件,并且正在经历痛苦。
一种更好的方法是在DKM1 & DKM2中将项目链接添加到源文件,并在RTP中对其进行编译。因为它是一个链接(而不是副本),所以在DKM中更改文件(例如,为了修复bug )也会在RTP中更改它。
在RTP项目中,执行"New > Directory“。选择“高级”按钮并选中“链接到现有目录”,然后选择"DKM1“目录。DKM1中的所有源文件现在都将成为RTP的一部分。对DKM2执行相同的操作。
编译RTP项目时,还应编译这些新文件。
https://stackoverflow.com/questions/19859662
复制相似问题