请教因内核版本条件编译的问题

内核编译和嵌入式产品的设计与开发
回复
西瓜q籽
帖子: 3
注册时间: 2019-02-27 11:25
系统: ubuntu 16.04 32位

请教因内核版本条件编译的问题

#1

帖子 西瓜q籽 » 2019-03-01 8:49

您好,由于编写好的程序实验不便,因此最好保证代码正确。
由于timer.h在内核版本不同里面的API有所区别,因此我用了如下方式:

代码: 全选

#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0)
codeexample1;
#else
codeexample2;
#endif
但是比如在我的电脑上编译了内核模块,由于我的电脑Linux版本高,因此编译出的模块用了codeexample2,那么这个模块在内核版本低的电脑上能否使用?如果我想在内核版本低的电脑上也能正常运行,是否必须在该电脑上重新编译? :Adore
*********************************************************
作为一个萌新的我,如果提的问题太蠢,请多包涵
头像
astolia
论坛版主
帖子: 6445
注册时间: 2008-09-18 13:11

Re: 请教因内核版本条件编译的问题

#2

帖子 astolia » 2019-03-01 10:16

西瓜q籽 写了: 2019-03-01 8:49 但是比如在我的电脑上编译了内核模块,由于我的电脑Linux版本高,因此编译出的模块用了codeexample2,那么这个模块在内核版本低的电脑上能否使用?
不能
西瓜q籽 写了: 2019-03-01 8:49 如果我想在内核版本低的电脑上也能正常运行,是否必须在该电脑上重新编译? :Adore
是的

另外,即使是在和编译环境相同内核版本的其他机器上,也同样建议你重新编译一遍,而不是直接拿编译好的文件去用。
这是因为linux内核是高度可定制化的,很多时候你并不能保证对方机器内核就一定存在你需要的功能,内核中的模块签名验证也会对外来模块的加载造成障碍。

当然如果你是在搞嵌入式开发,那么目标系统的内核版本已经确定了,也不用考虑内核升级之类的事,模块签名验证功能在嵌入式系统上一般也裁剪掉了。直接在和运行环境相同的开发环境上交叉编译出的模块直接拿去用也没问题。
回复