首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么"__tracepoint_sched_switch“没有定义

为什么"__tracepoint_sched_switch“没有定义
EN

Stack Overflow用户
提问于 2019-02-12 02:13:02
回答 1查看 433关注 0票数 2

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

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

当我尝试入侵时,出现了一个错误:

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

那么,我要怎么做才能让它正常工作呢?

UPD:目前我有完整的代码

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

更新:__tracepoint_sched_switch似乎没有导出以供其他模块使用:

代码语言:javascript
复制
$ 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?这就是它:

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

回答 1

Stack Overflow用户

发布于 2019-02-12 02:25:49

在内核中,符号__tracepoint_sched_switch()按如下方式导出:

代码语言:javascript
复制
EXPORT_TRACEPOINT_SYMBOL_GPL(sched_switch);

这意味着,只允许GPL代码访问此符号。您必须像这样声明您的模块许可证与GPL兼容:

代码语言:javascript
复制
MODULE_LICENSE("GPL");

在此之后,您的代码应该编译并链接到内核,而不会出现警告/错误。

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

https://stackoverflow.com/questions/54636651

复制
相关文章

相似问题

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