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

一、现象

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)





你可能感兴趣的:(Linux内核gprof与insmod模块报Unknown symbol __gnu_mcount_nc (err 0))