1. 程式人生 > >Linux核心gprof與insmod模組報Unknown symbol __gnu_mcount_nc (err 0)

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)