在可下载内核模块中调用代码时的未定义引用

时间:2013-11-08 12:56:09

标签: c linker vxworks

继续上一个问题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的引用,然后我进入依赖地狱,然后链接器尝试解析所有{{1}引用,包括所有标准的vxworks api调用。

编辑:只是为了额外的复杂性,我想调用的一些内核模块代码与实际生成我的RTP的模块相同......

1 个答案:

答案 0 :(得分:1)

你真的试图将一个环境变成一个完全不同的环境,并且正在经历这种方法所固有的痛苦。我不相信你能够让链接器忽略引用。

最好使用符号链接(可在Workbench环境中获得)来源文件并在RTP项目中使用它们。

或者根据DKM创建动态库(再次使用符号链接)并将其链接到您的RTP。

举个例子,假设你有以下Workbench工作区: DKM1 DKM2 RTP

根据这个问题,您试图链接DKM1& RTP中的2个目标文件正在经历痛苦。

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

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

编译RTP项目时,还应编译这些新文件。