1.Error: Invalid function arguments provided.
错误原因:传递参数过程有错误
解决办法:
a.走读代码,或者gdb调试,加打印,分析打印出现前后文的代码接口及传参,在gdb时打印出来看是否正常.
b.一般这种错误出现在系统接口附近,给系统的入参有问题,
譬如:UDP的发送接口sendto,函数原型:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
中buf本身为字符串指针变量,但是实际使用中写成&buf,变成发送buf变量所在内存的数据。
2.编译内核ko时遇到的问题且插入模块错误
(该错误是在编译ko出现以上错误时出现的,且编译最简单的hellko时也一样。):
编译错误:
/usr/src/kernels/3.10.0-123.el7.x86_64/arch/x86/Makefile:96: stack-protector enabled but compiler support broken
Makefile:616: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong not supported by compiler
CC [M] /home//kernel/kernel-test/drv_bcm5396_miim.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "mcount" [/home//kernel/kernel-test/drv_bcm5396_miim.ko] undefined!
insmod module.ko时报错:
insmod: ERROR: could not insert module drv_miim.ko: Unknown symbol in module
dmesg | tail查看后台日志:
[ 372.255526] drv_miim: Unknown symbol mcount (err 0)
各种查的结果:该问题在于gcc版本不兼容,实际测试并非gcc版本问题。
测试环境:a.操作系统是CentOS-7.0,由于需要会更换内核,内核更换后出现该问题,查看内核版本:uname -a 或lsb_release:CentOS7.0,gcc版本 4.8.2。
b.将gcc版本更新后4.8.5,然并卵,编译报告警,插入ko报unknown symbol。
c.更新本机内核相关文件,重新安装kernel-devel-($uname -r)后依旧报错,且插入有错误。
d. 在源码中加入变量:mcount后,插入内核ko时直接把内核搞挂,只能强制上下电重启机器。
e.换成虚拟机里的CentOS就好了,说明实体机的CentOS因内核更换留有后遗症,待解决。
解决方法:a.在link的KDIR目录下的Makefile中,将KBUILD_CFLAGS的 -pg 选项屏蔽后,模块即可插入。
但此时编译仍有告警。-pg选项是在源代码中插入性能分析工具,变量mcount也是用于性能分析和统计信息收集,但不是根本影响原因。
b.解决make时的告警问题:Makefile:616: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG:
-fstack-protector-strong not supported by compiler
问题根本原因:环境变量PATH有问题,当前编译环境的PATH混乱,更改当前编译环境PATH的路径先后顺序,将本机的/bin及/sbin路径提前,编译问题和插入后系统挂死问题均能解决。
以上问题的根本原因:当前终端的PATH环境变量有问题,更改环境变量的先后顺序,一般/usr/bin/在前面。
3、Makefile:1: *** missing separator. Stop
原因:第一行:!\bin\bash 书写没有问题,此时查看/etc/vimrc中支持的编码格式,一般情况包含utf-8,查询makefile的编码格式:file makefile是否是现有机器所支持的,要么在本机上修改支持utf-8,要么利用notepad++修改makefile的编码格式;
4、多级目录makefile的调用问题
问题描述:顶层的makefile为多个模块的集合,子makefile为一个模块的编译,一个模块对应一个二进制应用程序;在顶层执行make时,发现子makefile总是会删除一个源文件后再编译,但是在子目录下执行make时,编译不会删除源文件;
问题解决:顶层makefile传递参数给子目录makefile后,子目录没有正确处理,将子目录的makefile中编译的那条命令检查一下,发现target变量没有赋值,修改对应的变量赋值语句后编译正常。
总结:编译时的打印可以提示命令是否完整。
5、implicit declaration of function
问题原因:在编译调用该函数接口的C文件时,没有找到相关的函数声明。
可能原因:
a.函数接口所对应的H文件没有对相应的接口声明或者声明错误;
b.主调函数所在C文件没有#include对应的文件;
c.在现有的Makefile所指定的查找头文件的路径下,没有对应的函数声明;
总归:没有对应的接口声明,不知道该去哪里找,可能的情况有很多,按照工程进行分析。
问题解决:包含对应的头文件,在Makefile中添加对应的头文件路径;在相应的头文件添加对应的函数声明,确保make时可以链接到对应的声明文件。
6、warning: control reaches end of non-void function
问题原因:函数类型定义的是需要返回数据,但是在函数内部其他分支处理完成后,没有处理异常分支的返回值。
简言之:函数结束处没有return,加一个就好
7、scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: 没有那个文件或目录
构建内核时报错如上,该原因是当前环境中缺少ssl的库,需要安装,ubuntu下使用命令:apt-get install libssl