Точка трассировки ядра Linux: символ не определен при подключении функции зонда к точке трассировки - PullRequest
0 голосов
/ 16 января 2019

Я сейчас тренируюсь с трассировкой Linux. По сути, я пытаюсь создать модуль ядра, в котором определена функция зонда и подключена к точке трассировки ("trace_netif_receive_skb" в исходном файле ядра dev.c) в ядре Linux. Когда я скомпилировал и запустил модуль ядра на SLES11, он работал хорошо. Но когда я делал то же самое на SLES12, он жаловался, что символ не определен. Исходный код модуля ядра:

  1 #include <linux/module.h>
  2 #include <linux/kernel.h>
  3 #include <linux/init.h>
  4 #include <linux/skbuff.h>
  5 #include <trace/events/net.h>
  6 
  7 static void probe(void *ignore, struct sk_buff *skb)
  8 {
  9     printk(KERN_INFO "probe, protocol[0X%04X]\n", ntohs(skb->protocol));
 10 }
 11 
 12 static int __init init_tracepoint(void)
 13 {
 14     if (0 != register_trace_netif_receive_skb(probe, NULL))
 15     {
 16         printk(KERN_INFO "tracepoint init fails\n");
 17     }
 18 
 19     printk(KERN_INFO "tracepoint init succeeds\n");
 20     return 0;
 21 }
 22 
 23 static void __exit cleanup_tracepoint(void)
 24 {
 25     unregister_trace_netif_receive_skb(probe, NULL);
 26     tracepoint_synchronize_unregister();
 27 
 28     printk(KERN_INFO "tracepoint exit\n");
 29 }
 30 
 31 module_init(init_tracepoint);
 32 module_exit(cleanup_tracepoint);
 33 
 34 MODULE_LICENSE("GPL");

Это вывод на SLES11, об ошибке не сообщается.

suse11-1:~/works/tracepoint # make
make -C /lib/modules/3.0.76-0.11-default/build M=/root/works/tracepoint modules
make[1]: Entering directory `/usr/src/linux-3.0.76-0.11-obj/x86_64/default'
make -C ../../../linux-3.0.76-0.11 O=/usr/src/linux-3.0.76-0.11-obj/x86_64/default/. modules
  CC [M]  /root/works/tracepoint/tracepoint.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/works/tracepoint/tracepoint.mod.o
  LD [M]  /root/works/tracepoint/tracepoint.ko
make[1]: Leaving directory `/usr/src/linux-3.0.76-0.11-obj/x86_64/default'
suse11-1:~/works/tracepoint # insmod tracepoint.ko

Это вывод на SLES12, он говорит: ПРЕДУПРЕЖДЕНИЕ: "__tracepoint_netif_receive_skb" [/root/works/codes/tracepoint/tracepoint.ko] undefined! И я могу найти «Неизвестный символ __tracepoint_netif_receive_skb (err 0)» в /var/log/messages.

suse12-1:~/works/codes/tracepoint # make
make -C /lib/modules/4.4.21-69-default/build M=/root/works/codes/tracepoint modules
make[1]: Entering directory '/usr/src/linux-4.4.21-69-obj/x86_64/default'
  CC [M]  /root/works/codes/tracepoint/tracepoint.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "__tracepoint_netif_receive_skb" [/root/works/codes/tracepoint/tracepoint.ko] undefined!
  CC      /root/works/codes/tracepoint/tracepoint.mod.o
  LD [M]  /root/works/codes/tracepoint/tracepoint.ko
make[1]: Leaving directory '/usr/src/linux-4.4.21-69-obj/x86_64/default'
suse12-1:~/works/codes/tracepoint # 
suse12-1:~/works/codes/tracepoint # insmod tracepoint.ko 
insmod: ERROR: could not insert module tracepoint.ko: Unknown symbol in module

Я проверил исходный код ядра платформы трассировки SLES11 и SLES12: «определено имя __tracepoint _ ##», включающее / linux / tracepoint.h », не экспортируется, если не вызывается EXPORT_TRACEPOINT_SYMBOL () или EXPORT_TRACEPOINT_SYMBOL_GPL (), но Я не нашел места в кодах ядра Linux, где EXPORT_TRACEPOINT_SYMBOL (netif_receive_skb) или EXPORT_TRACEPOINT_SYMBOL_GPL (netif_receive_skb) вызывается для экспорта символа __tracepoint_netif_receive_skb. Тогда почему я не столкнулся с проблемой на SLES11? И как я могу заставить его работать на SLES12?

...