赞
踩
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.先将kernel进行性整体编译,在对该module进行编译(该module的.config选项为y)
2.配置环境变量(clang的环境变量)
3.上述命令再kernel根目录下执行
生成多个.bc .o .cmd
生成一个.ko .mod.c .mod
.bc:每个该模块所依赖的.c文件都会生成对应的.bc文件
.o :生成.bc后会编译生成对应的.o文件
.cmd:为该文件所对应的文件的生成命令等
.mod:为该模块所依赖的.o文件
.mod.c:定义了该模块在加载到内存中所需要的一些结构体、宏等
.ko:为所生成的可执行模块
extract-bc modulename.o/modulename.ko(稍后说区别)
make CC=wllvm CONFIG_I2C=m -C ./ M=drivers/i2c modules
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/
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文件
#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是驱动卸载函数的统一别名*/
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
...
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操作
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。