kernel do Linux, faltando o símbolo '__fentry__'

2

Tentando construir o driver EtherCAT master (driver de E / S em tempo real) em um RT Linux (SL6. 3) Eu continuo batendo em um problema de símbolo ausente ao construir os módulos do kernel 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 --
#

Estou usando o GCC v 4.9.1 , como você pode ver, o arquivo de configuração do kernel contém uma entrada relacionada a 'fentry' e está ativada.

O mais estranho é que eu esperaria que o System.map contivesse o símbolo __fentry__ declarado lá, mas não é!?

Eu tentei construir o driver EtherCAT contra o kernel 3.10-rt & 3.14-rt, mesmo problema, está reclamando sobre o símbolo __fentry__ ausente.

Se eu for em frente e iniciar o serviço EtherCAT, obtenho o seguinte:

# 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)
    
por fduff 03.02.2016 / 14:12

1 resposta

2

Eu entrei em contato com o departamento de TI do CERN sobre o pacote de kernel pré-compilado e para confirmar minhas suspeitas, eles criaram o pacote kernel-rt (rpm) baseado no GCC 4.4.7-x .

Como eu descubro, nas versões do GCC anteriores a 4.6, ele usa o símbolo __mcount__ para rastreamento de função quando necessário. Isso foi substituído por __fentry__ no GCC 4.6 e acima.

Resolução : A fim de corrigir o símbolo que faltava, tive que recompilar o kernel do Linux a partir do código-fonte usando uma versão mais recente do compilador (4.9.1 neste caso) e então consegui construir e vincular o módulo do kernel sem problemas usando o mesmo compilador.

    
por 15.02.2016 / 17:49