为什么“__tracepoint_sched_switch”未定义

问题描述 投票:2回答:1

我想编译和这个答案加载模块https://stackoverflow.com/a/29526520/9609843有一些错误:我包括<linux/sched/clock.h>因为它是由sched_clock需要,我传递的参数bool ignr void* ignore后,因为它是由(un)register_trace_sched_switch需要。所以,现在我的代码是编译,但是从make警告:

WARNING: "__tracepoint_sched_switch" [/some_path/myclock.ko] undefined!

当我试图用insmod,有一个错误:

insmod: ERROR: could not insert module myclock.ko: Unknown symbol in module

所以,我必须做的,做工作的吗?

UPD:整个代码我在这一刻

#include <linux/sched/clock.h>
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/types.h>
#include <linux/tracepoint.h>
#include <trace/events/sched.h>


MODULE_LICENSE("GPL");
MODULE_AUTHOR("somebody");


void my_sched_switch_probe(void* ignore, bool ignr, struct task_struct* prev, struct task_struct* next) {
    printk("my_sched_switch_probe: %s -> %s at %lu\n", prev->comm, next->comm,
    (unsigned long) sched_clock());
}


int cswtracer_init(void) {
    register_trace_sched_switch(my_sched_switch_probe, 0);
    return 0;
}


void cswtracer_fini(void) {
    unregister_trace_sched_switch(my_sched_switch_probe, 0);
}


module_init(cswtracer_init);
module_exit(cswtracer_fini);

UPD:似乎__tracepoint_sched_switch不会导出到其他模块来使用:

$ sudo cat /proc/kallsyms | grep __tracepoint_sched_switch
ffffffff91c123a0 D __tracepoint_sched_switch
$ cat /lib/modules/`uname -r`/build/Module.symvers | grep __tracepoint_sched_switch
$ (nothing was shown)

也许我的Makefile文件是错误的,有通过使用Makefile中一些选项来使用__tracepoint_sched_switch的方法吗?这里是:

ifneq ($(KERNELRELEASE),)
    obj-m := myclock.o
else
    CURRENT = $(shell uname -r)
    KDIR = /lib/modules/$(CURRENT)/build
    PWD = $(shell pwd)
default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
    rm *.o
    rm *.mod.c
    rm *.symvers
    rm *.order
    rm .cache.mk
    rm .*.*.cmd
    rm -r .tmp_versions
endif
c linux linux-kernel kernel kernel-module
1个回答
1
投票

在内核中,符号__tracepoint_sched_switch()导出这样的:

EXPORT_TRACEPOINT_SYMBOL_GPL(sched_switch);

这意味着,只有GPL代码被允许访问该符号。您必须声明你的模块的许可兼容GPL这样的:

MODULE_LICENSE("GPL");

在这之后,你的代码编译和链接到内核,而不警告/错误。

© www.soinside.com 2019 - 2024. All rights reserved.