编译小技巧

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

(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处理一下

 

 

// Module A (mod_a.c)
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>

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

// Export symbol func1
EXPORT_SYMBOL(func1);

static int __init hello_init(void)
{
       printk("Module 1,Init!\n");
       return 0;
}

static void __exit hello_exit(void)
{
       printk("Module 1,Exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);
 
 
 
// Module B (mod_b.c)
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>

static int func2(void)
{
       extern int func1(void);
       func1();
       printk("In Func: %s...\n",__func__);
       return 0;
}

static int __init hello_init(void)
{
       printk("Module 2,Init!\n");
       func2();
       return 0;
}

static void __exit hello_exit(void)
{
       printk("Module 2,Exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);
 
 
来自http://bbs.chinaunix.net/thread-1919530-1-1.html

posted on 2013-01-29 17:59  tianwang005  阅读(333)  评论(0)    收藏  举报

导航