试图建立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 --
#
我在用着海湾合作委员会 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)海湾合作委员会 4.4.7-x。
据我发现,在 4.6 之前的 GCC 版本中,它__mcount__
在需要时使用该符号进行函数跟踪。这__fentry__
在 GCC 4.6 及更高版本中已被替换。
解决:为了修复丢失的符号,我必须使用更新版本的编译器(本例中为 4.9.1)从源代码重新编译 Linux 内核,然后我必须使用以下命令构建和链接内核模块,没有问题相同的编译器。