(随时增加)linux编译错误集锦

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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值