接着上一个问题Using system symbol table from VxWorks RTP。
我正在将现有的VxWorks内核模块移植到RTP,然而,许多实际功能仍然嵌入在其他“可下载”内核模块中。它们是使用loadModule(作为启动过程的一部分)加载的,因此应该在RTP运行时的系统符号表中。]
但是,我无法生成RTP,无法从链接器获取有关未定义引用的错误。
如何说服链接器忽略对这些函数的引用?我正在将-Xbind-lazy -non-static
选项传递给链接器。
例如,内核模块(build As 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.out
的引用,包括所有标准vxworks api调用。编辑:为了增加复杂性,我想调用的一些内核模块代码与实际生成RTP的模块在同一个模块中。。。。。。
最佳答案
你真的想把一个环境变成一个完全不同的环境,并且正在经历这种方法固有的痛苦。我不相信你能让链接器忽略引用。
最好使用指向源文件的符号链接(在工作台环境中可用)并在RTP项目中使用这些链接。
或者基于DKMs创建动态库(同样,使用符号链接)并将它们链接到RTP。
例如,假设您有以下工作台工作区:
丹麦马克1
丹麦克朗
RTP公司
基于这个问题,您正试图在RTP中链接DKM1&2的对象文件,并且遇到了问题。
更好的方法是在DKM1和DKM2中添加到源文件的项目链接,并在RTP中编译它们。因为它是一个链接(而不是副本),那么在DKM中更改文件(例如修复一个bug)也会在RTP中更改它。
在RTP项目中,执行“New>目录”。选择“高级”按钮并检查“链接到现有目录”,然后选择“DKM1”目录。
DKM1中的所有源文件现在都将成为RTP的一部分。对DKM2也一样。
在编译RTP项目时,还应该编译这些新文件。
关于c - 在可下载的内核模块中调用代码时 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19859662/