|
一、现象
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)
|