免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: lofeng410

[内核模块] 分享两个很简单的编译问题(1)对ko进行strip -S(2)使用KBUILD_EXTRA_SYMBOLS [复制链接]

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-07-27 06:20:0015-16赛季CBA联赛之福建
日期:2017-03-23 18:32:41
发表于 2017-03-24 11:28 |显示全部楼层
Godbach 发表于 2017-03-23 22:56
回复 29# HazeC
解决就好,恭喜!

回复 26# Godbach
demo已经写好 中午回来 奉上。很高兴自己能分享有用的东西给大家。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2017-03-24 11:31 |显示全部楼层
回复 31# HazeC

赞!

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-07-27 06:20:0015-16赛季CBA联赛之福建
日期:2017-03-23 18:32:41
发表于 2017-03-24 12:18 |显示全部楼层
本帖最后由 HazeC 于 2017-03-24 12:29 编辑
Godbach 发表于 2017-03-23 22:56
回复 29# HazeC
解决就好,恭喜!

回复 26# Godbach
1、导出函数的内核模块(A.ko)
  1. int export_hello_kernel(void){
  2.         int i = 0;
  3.         printk("%s-%pS\n" ,__FUNCTION__ ,(void *)export_hello_kernel);
  4. }

  5. EXPORT_SYMBOL(export_hello_kernel);
复制代码
2、引用函数的内核模块(B.ko)
首先是读取 /proc/kallsyms,找到export_hello_kernel的函数地址。
代码来自4.4.1版本内核文件"kernel/livepatch/core.c"
  1. struct klp_verify_args args = {
  2.                 .name = name,
  3.                 .addr = addr,
  4.         };
复制代码
  1. static int klp_verify_callback(void *data, const char *name,
  2.                                struct module *mod, unsigned long addr)
  3. {
  4.         struct klp_verify_args *args = data;

  5.         if (!mod &&
  6.             !strcmp(args->name, name) &&
  7.             args->addr == addr)
  8.                 return 1;

  9.         return 0;
  10. }
复制代码
  1. static int klp_verify_vmlinux_symbol(const char *name, unsigned long addr)
  2. {
  3.         int ret;

  4.         mutex_lock(&module_mutex);
  5.         ret = kallsyms_on_each_symbol(klp_verify_callback, &args);
  6.         mutex_unlock(&module_mutex);

  7.         if (!ret) {
  8.                 pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n",
  9.                         name, addr);
  10.                 return -EINVAL;
  11.         }

  12.         return 0;
  13. }
复制代码


调用klp_verify_vmlinux_symbol,name为"export_hello_kernel" ,addr是输出变量,保存的就是导出函数的地址。
找到函数地址之后
  1. int (*run)(void) = addr;
复制代码
run即为export_hello_kernel的指针了,可以直接调用了。


这样内核模块的开发就可以把核心的功能放在一个模块,其他功能可以以插件的形式挂载了。


啊哈。。直接拿来内核的代码,献丑了。CU排版真心不好用啊。


评分

参与人数 1可用积分 +8 收起 理由
Godbach + 8 赞一个!

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2017-03-24 14:25 |显示全部楼层
回复 33# HazeC

赞!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2017-03-24 14:27 |显示全部楼层
回复 33# HazeC

把你这个帖子,置顶到主题帖后买了。

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-07-27 06:20:0015-16赛季CBA联赛之福建
日期:2017-03-23 18:32:41
发表于 2017-03-27 09:26 |显示全部楼层
回复 35# Godbach

哈 感谢版主打赏

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2017-03-27 13:39 |显示全部楼层
回复 36# HazeC
有干货的分享应该鼓励。欢迎以后多多分享。


论坛徽章:
0
发表于 2017-03-27 16:52 |显示全部楼层

除了被依赖module需要  EXPORT_SYMBOL(func);

其他和常规c没有任何区别吧。

a:

  1. int jerry_double(const int n)
  2. {
  3. return 2*n ;
  4. }


  5. EXPORT_SYMBOL(jerry_double);
复制代码


b:

  1. extern jerry_double();
复制代码


然后就直接用了。








论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-07-27 06:20:0015-16赛季CBA联赛之福建
日期:2017-03-23 18:32:41
发表于 2017-03-28 10:42 |显示全部楼层
回复 38# nuclearxin

连接是重点

论坛徽章:
0
发表于 2017-03-29 14:01 |显示全部楼层
本帖最后由 nuclearxin 于 2017-03-29 17:17 编辑

回复 39# HazeC


不太明白?



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP