구축하려고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 커널을 다시 컴파일해야 했습니다. 그런 다음 동일한 버전을 사용하여 문제 없이 커널 모듈을 빌드하고 링크해야 했습니다. 컴파일러 .