Linux核心gprof與insmod模組報Unknown symbol __gnu_mcount_nc (err 0)
阿新 • • 發佈:2019-01-29
一、現象
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
遮蔽掉gcc編譯引數後問題解決。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
3.類似錯誤
unkonw symbol__stack_chk_guard
unkonw symbol__stack_chk_fail
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)