Linux-Kernel

Linux 核心,缺少“fentry”符號

  • February 15, 2016

嘗試在 RT Linux (SL6.3) 上建構EtherCAT 主驅動程序(實時 I/O 驅動程序)時,我在建構 EtherCAT 核心模組時不斷遇到缺少符號的問題:

# make modules
make -C "/usr/src/kernels/3.8.13-rt27.40.el6rt.x86_64" M="/root/etherlabmaster-code-08aa7305b9baba37bdd9eb4d8c2a8762aa56a7e2" modules
make[1]: Entering directory `/usr/src/kernels/3.8.13-rt27.40.el6rt.x86_64'
 Building modules, stage 2.
 MODPOST 4 modules
WARNING: "__fentry__" [/root/etherlabmaster-code-08aa7305b9baba37bdd9eb4d8c2a8762aa56a7e2/master/ec_master.ko] undefined!
WARNING: "__fentry__" [/root/etherlabmaster-code-08aa7305b9baba37bdd9eb4d8c2a8762aa56a7e2/examples/mini/ec_mini.ko] undefined!
WARNING: "__fentry__" [/root/etherlabmaster-code-08aa7305b9baba37bdd9eb4d8c2a8762aa56a7e2/devices/ec_generic.ko] undefined!
WARNING: "__fentry__" [/root/etherlabmaster-code-08aa7305b9baba37bdd9eb4d8c2a8762aa56a7e2/devices/e1000e/ec_e1000e.ko] undefined!
make[1]: Leaving directory `/usr/src/kernels/3.8.13-rt27.40.el6rt.x86_64'

# grep -Hin "fentry" /boot/config-`uname -r`
/boot/config-3.8.13-rt27.40.el6rt.x86_64:4797:CONFIG_HAVE_FENTRY=y

# strings /boot/System.map-3.8.13-rt27.40.el6rt.x86_64 | grep -i "fentry"
-- nothing --
#

我正在使用GCC v 4.9.1,如您所見,核心配置文件確實包含與“fentry”相關的條目並已啟用。

奇怪的是,我希望System.map包含__fentry__在那裡聲明的符號,但事實並非如此!?

我已經嘗試針對核心 3.10-rt 和 3.14-rt 建構 EtherCAT 驅動程序,同樣的問題,它抱怨__fentry__缺少符號。

如果我繼續啟動 EtherCAT 服務,我會得到以下資訊:

# service ethercat start
Starting EtherCAT master 1.5.2 FATAL: Error inserting ec_master (/lib/modules/3.8.13-rt27.40.el6rt.x86_64/ethercat/master/ec_master.ko): Unknown symbol in module, or unknown parameter (see dmesg)
failed

# dmesg | tail
...
ec_master: Unknown symbol __fentry__ (err 0)

我就他們預先建構的核心包與 CERN IT 部門取得了聯繫,為了證實我的懷疑,他們已經建構了基於GCC 4.4.7-x的 kernel-rt 包 (rpm) 。

我發現,在 4.6 之前的 GCC 版本中,它__mcount__在需要時使用該符號進行函式跟踪。__fentry__這已在 GCC 4.6 及更高版本中被替換。


解決方案:為了修復失去的符號,我必須使用更新版本的編譯器(在本例中為 4.9.1)從原始碼重新編譯 Linux 核心,然後建構和連結核心模組沒問題使用相同的編譯器。

引用自:https://unix.stackexchange.com/questions/259591