首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux内核,缺少“__fentry__”符号

Linux内核,缺少“__fentry__”符号
EN

Unix & Linux用户
提问于 2016-02-03 13:12:12
回答 1查看 4.9K关注 0票数 2

为了在RT (SL6.3)上构建EtherCAT主机驱动程序(实时I/O驱动程序),我在构建EtherCAT内核模块时经常遇到一个丢失的符号问题:

代码语言:javascript
运行
复制
# 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服务,将得到以下信息:

代码语言:javascript
运行
复制
# 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)
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 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内核,然后使用相同的编译器构建和链接内核模块没有问题。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/259591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档