linux模块编译后加载不成功

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux模块编译后加载不成功相关的知识,希望对你有一定的参考价值。

我在menuconfig 中选择了要编译的USBNET模块,编译成功后,modprobe usbnet,却报错了:modprobe: ERROR: could not insert 'usbnet': Exec format error,用dmesg打印出来的信息是:usbnet: exports duplicate symbol usbnet_device_suggests_idle (owned by kernel),请各位大牛支招!

参考技术A 从dmesg的输出来看,内核已经export了一个同样的symbol,你加载的驱动再次输出一遍就有问题了。
可能原因:
usbnet模块可能在系统启动后已经加载了,你不需要手动再次加载。这个又可能由两个原因造成:(1)你在menuconfig中选择USBNET模块为[*]模式(驱动集成到内核),而非[M]模式(驱动以模块方式动态插入内核);(2)你已经选择了[M]模式,但是按照系统的默认配置在系统启动过程中会自动动态加载这个驱动,无需手动加载;
虽然选择了USBNET模块并重新编译了内核,但是新编译的内核并没有更新到系统上,系统还是使用的老的内核。
现在你应该可以排除一下上面的猜测的几种可能原因吧?

LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)

本文转自:原文链接  http://www.cnblogs.com/doseoer/p/4367536.html

网上我看到有很多相关的文章都是简述这个问题的,但毕竟因为LINUX版本众多,很多LIUNX命令或路径都有所差别,有时同样的命令却不能执行一样的操作。

这篇文章是我在实际运用当中配置成功的实例,希望对大家有所帮助,开源是来自每个人的无私帮助,每个人的成长都是需要别人的扶植!废话就说到这了!

http://php.net/downloads.php  (相应PHP版本下载)

1、首先确定LINUX下已安装的PHP版本,因为不同PHP版本对于追加动态模块有兼容性问题(可能路径,配置?其他?),往往报错不能安装,追加的模块必须版本一致。

查看PHP版本有多种方法:

①运行php -v(但在我的64位LIUNX测试过没作用,原因你知道的了!)

②在已安装好的PHP路径下找到php-config并进行查看,可以vi或cat (关键字:version="XXXXXXX"为PHP版本号)

vi 或cat php-config

2、下载好的PHP源代码包需人工上传到FTP网络服务器上,这时你的tar包可能只是放在WWW下,为了你自己方便查找和使用,建议建立自己的source文件夹进行存放。

建立文件夹:mkdir XXXXXX(文件夹名)

移动或复制文件:mv或cp php.tar /sourece(注意路径,”/“我是在根目录下创建的临时文件夹!)

解压tar包:tar zxfv php.tar(源代码tar包)

3、现在进入正题了,以追加动态模块openssl.so为例,进入PHP源码文件夹后,执行phpize生成configure进行模块追加:

#cd /source/php/ext/openssl    进入源码包的OPENSSL模块文件夹

#/var/www/php/bin/phpize     注意这个是已安装好的PHP路径(有些是版本可能是在/usr/local/******下,每个人的安装习惯不同)

如出现以下错误:Cannot find config.m4. *****************************************

解决方法:

查看源码包OPENSSL文件夹下是否有config0.m4,如果有可执行,
#mv config0.m4 config.m4

4、进入最后的编译阶段了,我编译时是比较顺利的(有时ERROR如果出现,我也不好做阐述,只能靠自己查看errorlog日志了)

#./configure --with-openssl --with-php-config=/var/www/php/bin/php-config(注意:这个参数后的是你本机已安装好的PHP路径)
#make

#make test (测试编译结果)

#make install

当成功时会返回成功信息(注意查看,SO文件的所在位置): 

  Installing shared extensions:     /usr/lib/20060613/(这路径是我虚拟的,正确请自己查找,会生成openssl.so文件)

一般规范点的话,会把追加的SO模块放在一个指定的文件夹里,就在PHP安装好的目录下的extensions文件夹内

#mv /*****/*****/openssl.so /var/www/php/lib/php/extensions

动态模块追加编译已全部完成了。。。。

最后就是要PHP支持加载这些追加的动态模块了,vi编辑PHP下的配置文件php.ini。

#vi /*******/*******/php.ini

进入编辑器后可以看到PHP的所有相关配置,查找extension_dir这个配置的选项,

vi后可直接‘/extension_dir '查找,找到后可能是这样的:

extension_dir  = "./"

需修改成: 

extension_dir  = "/var/www/php/lib/php/extensions/"   (注意是so文件的所在)

extension=openssl.so   (so模块文件名)
最后保存退出! :wq!

接着就是重启 apache服务器了!(有说人不用,但也就一个命令,我觉得配置好重启还是安心点!)

可以用命令查看下PHP的运行加载:    /var/www/php/bin/php -m|grep openssl   (路径啥的我就不说了,就是安装好的PHP路径就是了)

出现的信息可能会出现一些错误,但都是没关系的:类似找不到什么DLL文件啊(openssl.dll之类的),别管他,DLL是WINDOWS主机服务器模块加载的类型,UNIX和LINUX是以SO为模块加载名的!

 

以上是关于linux模块编译后加载不成功的主要内容,如果未能解决你的问题,请参考以下文章

linux设备驱动的模块编译

如何编译一个linux下的驱动模块

linux 模块编译无法生成.ko文件,显示如下信息,请问是啥原因啊?

Linux 内核编译 Linux 内核 ⑦ ( 安装内核模块 | 安装内核 | 重启系统 | 查看当前内核版本 )

LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)

如何编译一个linux下的驱动模块