Linux内核gprof与insmod模块报Unknown symbol __gnu_mcount_nc (err 0)

来源:互联网 发布:大熊猫优化 编辑:程序博客网 时间:2024/05/18 00:27

一、现象

insmod一个自己编译的ko,会报如下错误:

Unknown symbol __gnu_mcount_nc (err 0)
二、分析

1.对比之前版本ko文件

grep “__gnu_mcount_nc”

发现其他版本(包括内核更高和更低的版本中)没有这个符号表。

2.在该ko下

grep “__gnu_mcount_nc”

发现有如下符号表
另外,kernel顶层目录下Module.symvers也有该“__gnu_mcount_nc“
三、解决
这个是开启了gprof,才会出现的问题,按道理内核不应该去gprof的。
如果只要编译通过,只需要把CFLAGS的-pg或-p参数去掉,就可以。
对于gprof的实现,其实是编译器做来手脚,在每个函数调用前先调用一个函数,mcount。
在Makefile中找到CFLAGS的-pg,干掉之后,再编译果然就没有出问题了。

发现该kernel顶层Makefile
 ifdef CONFIG_FUNCTION_TRACER #KBUILD_CFLAGS  += -pg #modify tank ifdef CONFIG_DYNAMIC_FTRACE        ifdef CONFIG_HAVE_C_RECORDMCOUNT                BUILD_C_RECORDMCOUNT := y                export BUILD_C_RECORDMCOUNT        endif endif endif
屏蔽掉gcc编译参数后问题解决。
3.类似错误

unkonw symbol__stack_chk_guard

unkonw symbol__stack_chk_fail

KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)





0 0