Linuxカーネル、「__fentry__」シンボルがありません

Linuxカーネル、「__fentry__」シンボルがありません

構築しようEtherCATマスターRT Linux(SL6.3)のドライバ(リアルタイム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)

ベストアンサー1

私は事前に構築されたカーネルパッケージについてCERN ITに連絡し、彼らが次のものに基づいてkernel-rtパッケージ(rpm)を構築したことを疑いました。GCC 4.4.7-x

私が知っている限り、4.6より前のGCCバージョンでは、__mcount__必要なときに関数を追跡するためにこのシンボルを使用しました。これは__fentry__GCC 4.6以降で置き換えられました。


解決する:欠落しているシンボルを修正するために、最新バージョンのコンパイラ(この場合は4.9.1)を使用してソースからLinuxカーネルを再コンパイルする必要がありました。その後、同じバージョンを使用して問題なくカーネルモジュールをビルドしてリンクする必要がありました。コンパイラ。

おすすめ記事