为了在RT (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 v4.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)
发布于 2016-02-15 16:49:38
我与CERN IT部门联系了他们的预构建内核包,并证实了我的怀疑,他们构建了基于GCC 4.4.7-x的内核-rt包(rpm)。
正如我所发现的,在4.6之前的GCC版本中,它在需要时使用__mcount__
符号进行函数跟踪。这已被GCC 4.6及以上的__fentry__
所取代。
解决方案:为了修复丢失的符号,我必须使用最新版本的编译器(在本例中为4.9.1)从源代码重新编译Linux内核,然后使用相同的编译器构建和链接内核模块没有问题。
https://unix.stackexchange.com/questions/259591
复制相似问题