当前位置:   article > 正文

编译单个kernel module,生成.ko文件提取.bc文件_clang编译ko

clang编译ko
编译单个kernel module,生成.ko文件提取.bc文件
详解:
  • 命令:
make CC=wllvm CONFIG_module_name=m -C ./ M=path/to/module modules
//1.CC=wllvm为编译选项
//2.CONFIG_module_name=m表示编译成module
//3.—C 指定从哪找makefile文件
//4.M= 指定被编译模块的路径
//5.modules
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 注意事项:
1.先将kernel进行性整体编译,在对该module进行编译(该module的.config选项为y)
2.配置环境变量(clang的环境变量)
3.上述命令再kernel根目录下执行
  • 1
  • 2
  • 3
  • 编译结果:
生成多个.bc   .o    .cmd
生成一个.ko   .mod.c  .mod
.bc:每个该模块所依赖的.c文件都会生成对应的.bc文件
.o :生成.bc后会编译生成对应的.o文件
.cmd:为该文件所对应的文件的生成命令等
.mod:为该模块所依赖的.o文件
.mod.c:定义了该模块在加载到内存中所需要的一些结构体、宏等
.ko:为所生成的可执行模块
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 提取.bc文件
extract-bc modulename.o/modulename.ko(稍后说区别)
  • 1
举例说明:
  • 执行命令:
make CC=wllvm CONFIG_I2C=m -C ./ M=drivers/i2c modules
  • 1
  • 查看生成文件:
XXXXXXX:~/XXXXX/new_test/linux-5.12.10$ cd drivers/i2c/
XXXXXXX:~/XXXXX/new_test/linux-5.12.10/drivers/i2c$ ll
total 1344
drwxrwxr-x   5 xl xl   4096 Mar 28 03:00 ./
drwxrwxr-x 139 xl xl   4096 Mar 28 02:12 ../
drwxrwxr-x   2 xl xl   4096 Mar 28 02:11 algos/
-rw-rw-r--   1 xl xl    612 Mar 28 02:11 built-in.a
-rw-rw-r--   1 xl xl    335 Mar 28 02:11 .built-in.a.cmd
drwxrwxr-x   2 xl xl   4096 Mar 28 02:11 busses/
-rw-rw-r--   1 xl xl   2991 Jun 10  2021 i2c-boardinfo.c
-rw-rw-r--   1 xl xl   4744 Mar 28 02:11 i2c-boardinfo.o
-rw-rw-r--   1 xl xl  41182 Mar 28 02:11 .i2c-boardinfo.o.cmd
-rw-rw-r--   1 xl xl  18402 Jun 10  2021 i2c-core-acpi.c
-rw-rw-r--   1 xl xl  19904 Mar 28 03:00 i2c-core-acpi.o
-rw-rw-r--   1 xl xl  36900 Mar 28 03:00 .i2c-core-acpi.o.bc
-rw-rw-r--   1 xl xl  40743 Mar 28 03:00 .i2c-core-acpi.o.cmd
-rw-rw-r--   1 xl xl  68321 Jun 10  2021 i2c-core-base.c
-rw-rw-r--   1 xl xl  98928 Mar 28 03:00 i2c-core-base.o
-rw-rw-r--   1 xl xl 157884 Mar 28 03:00 .i2c-core-base.o.bc
-rw-rw-r--   1 xl xl  55980 Mar 28 03:00 .i2c-core-base.o.cmd
-rw-rw-r--   1 xl xl   2639 Jun 10  2021 i2c-core.h
-rw-rw-r--   1 xl xl 151360 Mar 28 03:00 i2c-core.ko
-rw-rw-r--   1 xl xl    174 Mar 28 03:00 .i2c-core.ko.cmd
-rw-rw-r--   1 xl xl     86 Mar 28 03:00 i2c-core.mod
-rw-rw-r--   1 xl xl    534 Mar 28 03:00 i2c-core.mod.c
-rw-rw-r--   1 xl xl    162 Mar 28 03:00 .i2c-core.mod.cmd
-rw-rw-r--   1 xl xl   2608 Mar 28 03:00 i2c-core.mod.o
-rw-rw-r--   1 xl xl   6328 Mar 28 03:00 .i2c-core.mod.o.bc
-rw-rw-r--   1 xl xl  29919 Mar 28 03:00 .i2c-core.mod.o.cmd
-rw-rw-r--   1 xl xl 166360 Mar 28 03:00 i2c-core.o
-rw-rw-r--   1 xl xl    163 Mar 28 03:00 .i2c-core.o.cmd
-rw-rw-r--   1 xl xl   6626 Jun 10  2021 i2c-core-of.c
-rw-rw-r--   1 xl xl   2937 Jun 10  2021 i2c-core-slave.c
-rw-rw-r--   1 xl xl  20381 Jun 10  2021 i2c-core-smbus.c
-rw-rw-r--   1 xl xl  53704 Mar 28 03:00 i2c-core-smbus.o
-rw-rw-r--   1 xl xl  81128 Mar 28 03:00 .i2c-core-smbus.o.bc
-rw-rw-r--   1 xl xl  54113 Mar 28 03:00 .i2c-core-smbus.o.cmd
-rw-rw-r--   1 xl xl  19960 Jun 10  2021 i2c-dev.c
-rw-rw-r--   1 xl xl  12767 Jun 10  2021 i2c-mux.c
-rw-rw-r--   1 xl xl   6437 Jun 10  2021 i2c-slave-eeprom.c
-rw-rw-r--   1 xl xl   4268 Jun 10  2021 i2c-slave-testunit.c
-rw-rw-r--   1 xl xl  10343 Jun 10  2021 i2c-smbus.c
-rw-rw-r--   1 xl xl  11952 Mar 28 02:11 i2c-smbus.o
-rw-rw-r--   1 xl xl  43283 Mar 28 02:11 .i2c-smbus.o.cmd
-rw-rw-r--   1 xl xl  10044 Jun 10  2021 i2c-stub.c
-rw-rw-r--   1 xl xl   5211 Jun 10  2021 Kconfig
-rw-rw-r--   1 xl xl    680 Jun 10  2021 Makefile
-rw-rw-r--   1 xl xl     24 Mar 28 03:00 modules.order
-rw-rw-r--   1 xl xl    238 Mar 28 03:00 .modules.order.cmd
-rw-rw-r--   1 xl xl      0 Mar 28 03:00 Module.symvers
-rw-rw-r--   1 xl xl    164 Mar 28 03:00 .Module.symvers.cmd
drwxrwxr-x   2 xl xl   4096 Mar 28 02:11 muxes/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
生成文件解读:
built-in.a	//保存该目录及其子目录下所有生成的.o文件,为其父目录的built-in.a提供帮助
.built-in.a.cmd	//built-in.a文件生成命令等
i2c-core.ko	//所生成的可执行的module文件
i2c-core.mod.c	//下详解
i2c-core.o	//多.o文件经ld生成的大.o文件
i2c-core.mod	//该module所依赖的.o文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • i2c-core.mod.c源码及解释:
#include <linux/module.h>
#define INCLUDE_VERMAGIC
#include <linux/build-salt.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>

BUILD_SALT;

MODULE_INFO(vermagic, VERMAGIC_STRING);
MODULE_INFO(name, KBUILD_MODNAME);

__visible struct module __this_module
__section(".gnu.linkonce.this_module") = {
	.name = KBUILD_MODNAME,
	.init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
	.exit = cleanup_module,
#endif
	.arch = MODULE_ARCH_INIT,
};

#ifdef CONFIG_RETPOLINE
MODULE_INFO(retpoline, "Y");
#endif

MODULE_INFO(depends, "");


/* 文件里定义了struct module类型的变量__this_module,
__this_module变量初始化的信息就是用来描述驱动,这个结构体会被链接进ko文件中,
将来在加载ko驱动时,内核中会有代码将这个结构体从ko文件中解析出来,并根据这个结构体来加载驱动。
 init_module:这个函数是驱动代码中用module_init宏声明的驱动加载函数,init_module是驱动加载函数的统一别名
cleanup_module:这个函数是驱动代码中用module_exit宏声明的驱动卸载函数,cleanup_module是驱动卸载函数的统一别名*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
i2c-core.ko i2c-core.o分析
  • 通过extract-bc工具提取.bc文件
XXXXXX:~/XXXXXX/new_test/linux-5.12.10/drivers/i2c$ extract-bc i2c-core.ko
XXXXXX:~/XXXXXX/new_test/linux-5.12.10/drivers/i2c$ ls
...
i2c-core.ko.bc
...
XXXXXX:~/XXXXXX/new_test/linux-5.12.10/drivers/i2c$ extract-bc i2c-core.o
XXXXXX:~/XXXXXX/new_test/linux-5.12.10/drivers/i2c$ ls
...
i2c-core.o.bc
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 分析生成文件详情
XXXXXX:~/XXXXXX/new_test/linux-5.12.10/drivers/i2c$ objdump -s llvm.bc i2c-core.ko

...
Contents of section .llvm_bc:
 0000 2f686f6d 652f786c 2f646174 615f7072  /XXXXXX/new_test
 0020 2f6c696e 75782d35 2e31322e 31302f64  /linux-5.12.10/d
 0030 72697665 72732f69 32632f2e 6932632d  rivers/i2c/.i2c-
 0040 636f7265 2d626173 652e6f2e 62630a2f  core-base.o.bc./
 0050 686f6d65 2f786c2f 64617461 5f70726f  XXXXXX/new_test/
 0070 6c696e75 782d352e 31322e31 302f6472  linux-5.12.10/dr
 0080 69766572 732f6932 632f2e69 32632d63  ivers/i2c/.i2c-c
 0090 6f72652d 736d6275 732e6f2e 62630a2f  ore-smbus.o.bc./
 00a0 686f6d65 2f786c2f 64617461 5f70726f  XXXXXX/new_test/
 00c0 6c696e75 782d352e 31322e31 302f6472  linux-5.12.10/dr
 00d0 69766572 732f6932 632f2e69 32632d63  ivers/i2c/.i2c-c
 00e0 6f72652d 61637069 2e6f2e62 630a2f68  ore-acpi.o.bc./X
 00f0 6f6d652f 786c2f64 6174615f 70726f74  XXXXX/new_test/l
 0100 5f73656c 662f6e65 775f7465 73742f6c  inux-5.12.10/dri
 0110 696e7578 2d352e31 322e3130 2f647269  vers/i2c/.i2c-co
 0120 76657273 2f693263 2f2e6932 632d636f  re.mod.o.bc. 
 0130 72652e6d 6f642e6f 2e62630a              
 
 //通过objdump查看其llvm.bc段,可以的到i2c-core.ko.bc由哪些.bc文件通过llvm-link得到
 
 
XXXXXX:~/XXXXXX/new_test/linux-5.12.10/drivers/i2c$ objdump -s llvm.bc i2c-core.o
 
 ...
 Contents of section .llvm_bc:
 0000 2f686f6d 652f786c 2f646174 615f7072  /XXXXXX/new_test
 0010 6f745f73 656c662f 6e65775f 74657374  /linux-5.12.10/d
 0020 2f6c696e 75782d35 2e31322e 31302f64  rivers/i2c/.i2c-
 0030 72697665 72732f69 32632f2e 6932632d  core-base.o.bc./
 0040 636f7265 2d626173 652e6f2e 62630a2f  XXXXXX/new_test/
 0050 686f6d65 2f786c2f 64617461 5f70726f  linux-5.12.10/dr
 0060 745f7365 6c662f6e 65775f74 6573742f  ivers/i2c/.i2c-c
 0070 6c696e75 782d352e 31322e31 302f6472  ore-smbus.o.bc./
 0080 69766572 732f6932 632f2e69 32632d63  XXXXXX/new_test/
 0090 6f72652d 736d6275 732e6f2e 62630a2f  linux-5.12.10/dr
 00a0 686f6d65 2f786c2f 64617461 5f70726f  ivers/i2c/.i2c-c
 00b0 745f7365 6c662f6e 65775f74 6573742f  ore-acpi.o.bc. 
 00c0 6c696e75 782d352e 31322e31 302f6472  
 00d0 69766572 732f6932 632f2e69 32632d63  
 00e0 6f72652d 61637069 2e6f2e62 630a       
 ...
 
  //通过objdump查看其llvm.bc段,可以的到i2c-core.o.bc由哪些.bc文件通过llvm-link得到
 
 
 //区别:.ko文件在.o文件的基础上将.mod.o.bc文件也进行了llvm-link操作
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/311699
推荐阅读
相关标签
  

闽ICP备14008679号