+ -
当前位置:首页 → 问答吧 → 分享两个很简单的编译问题(1)对ko进行strip -S(2)使用KBUILD_EXTRA_SYMBOLS

分享两个很简单的编译问题(1)对ko进行strip -S(2)使用KBUILD_EXTRA_SYMBOLS

时间:2010-12-09

来源:互联网

本帖最后由 lofeng410 于 2010-12-09 23:02 编辑

可能很多高手早就知道这样处理,但是俺是最近才琢磨明白,呵呵

(1)对编译所得的.ko进行strip -S,处理掉调试信息,这样可以大大缩小ko文件的大小

(2)使用KBUILD_EXTRA_SYMBOLS
主要使用于下面这样的场合:
有两个我们自己的模块,其中Module B使用了Module A中export的函数,因此在Module B的Makefile中必须加上这样的选项
KBUILD_EXTRA_SYMBOLS += /path/to/Module A/Module.symvers
export KBUILD_EXTRA_SYMBOLS
这样在编译Module B时,才不会出现Warning,提示说func1这个符号找不到,而编译得到的ko加载时也会出错。

需要注意的是:
(1)KBUILD_EXTRA_SYMBOLS 赋值时必须使用+=,而不能使用=及:=,这个是实验出来的,至于为什么必须这样,还不明白。如果哪位高手知道,还请指教~~
(2)KBUILD_EXTRA_SYMBOLS 必须使用export处理一下
  1. // Module A (mod_a.c)
  2. #include<linux/init.h>
  3. #include<linux/module.h>
  4. #include<linux/kernel.h>

  5. static int func1(void)
  6. {
  7.        printk("In Func: %s...\n",__func__);
  8.        return 0;
  9. }

  10. // Export symbol func1
  11. EXPORT_SYMBOL(func1);

  12. static int __init hello_init(void)
  13. {
  14.        printk("Module 1,Init!\n");
  15.        return 0;
  16. }

  17. static void __exit hello_exit(void)
  18. {
  19.        printk("Module 1,Exit!\n");
  20. }

  21. module_init(hello_init);
  22. module_exit(hello_exit);
复制代码
  1. // Module B (mod_b.c)
  2. #include<linux/init.h>
  3. #include<linux/kernel.h>
  4. #include<linux/module.h>

  5. static int func2(void)
  6. {
  7.        extern int func1(void);
  8.        func1();
  9.        printk("In Func: %s...\n",__func__);
  10.        return 0;
  11. }

  12. static int __init hello_init(void)
  13. {
  14.        printk("Module 2,Init!\n");
  15.        func2();
  16.        return 0;
  17. }

  18. static void __exit hello_exit(void)
  19. {
  20.        printk("Module 2,Exit!\n");
  21. }

  22. module_init(hello_init);
  23. module_exit(hello_exit);
复制代码

作者: lofeng410   发布时间: 2010-12-09



QUOTE:
KBUILD_EXTRA_SYMBOLS += /path/to/Module A/Module.symvers
export KBUILD_EXTRA_SYMBOLS


你是在哪个内核版本上实现的。

作者: Godbach:   发布时间: 2010-12-10

测试一下对Module A 中:


QUOTE:
EXPORT_SYMBOL(func1);


替换为:


QUOTE:
EXPORT_SYMBOL_GPL(func1);



然后在 Module B 直接调用的情形。

作者: Godbach   发布时间: 2010-12-10