[Linux]针对操作功能裁剪系统后进一步对未使用源代码删除步骤探索

1 操作操作系统;

2 lsmod查看当前系统在操作时用到了哪些模块或者驱动

3 下载linux内核源代码,并解压

3 进入解压好的目录并执行make localmodconfig,这会生成一个config文件(如果注意看这个config文件的内容就会明白,或者直接grep "=" config文件,可以看到要编译的模块已经非常少了。),这里是配置基于下载的内核源代码下次编译时,只编译前面对系统操作使用到的功能所对应的内核源代码,这步实现 很大程度上的裁减,因为内核源代码非常多,反而一台电脑上使用的功能,尤其是驱动真正使用的代码量非常非常少,这里有一个问题,在新生成的config文件时,并不会对原来代码目录的*.c,*.h文件进行变化。

4 基于第3步的编译,实际上如果操作系统安装的内核版本跟下载的源代码内核版本不一致,编译时还需要配置下就好了。

5  如果不出问题,编译内核源代码完成,并且把对应的二进制生成到/boot目录后,并设置好下次基于新编译的内核二进制,系统起来看下内核版本就可以了。

内核源代码在学习的过程中有另一个问题,就是源代码文件数量非常多,目录非常多,对于有兴趣学习的读者来说, 会很麻烦。接下来,讲一个可能有用的办法。

而且还有一个问题,就是编译框架的复杂性,难以理解的汇编语法,刁钻的代码,一般看代码还不如原地爆炸。

源代码数量多的话,IDE解析非常慢,而且调用关系复杂,人型调用栈不深的话,估计会晕代码。

1 编译时加上V=1这个变量,编译时可以看到当前编译的.c,生成的.o,以及一些参数信息等等

   clear; make V=1 -j8 >build.log 2>&1 

比如这种:

gcc -Wp,-MMD,drivers/base/power/.sysfs.o.d -nostdinc -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -std=gnu11 -fshort-wchar -funsigned-char -fno-common -fno-PIE -fno-strict-aliasing -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=none -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register -mindirect-branch-cs-prefix -mfunction-return=thunk-extern -fno-jump-tables -mharden-sls=all -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -O2 -fno-allow-store-data-races -fstack-protector-strong -fno-omit-frame-pointer -fno-optimize-sibling-calls -ftrivial-auto-var-init=zero -fno-stack-clash-protection -fzero-call-used-regs=used-gpr -pg -mrecord-mcount -mfentry -DCC_USING_FENTRY -fmin-function-alignment=16 -fstrict-flex-arrays=3 -fno-strict-overflow -fno-stack-check -fconserve-stack -Wall -Wundef -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Werror=strict-prototypes -Wno-format-security -Wno-trigraphs -Wno-frame-address -Wno-address-of-packed-member -Wmissing-declarations -Wmissing-prototypes -Wframe-larger-than=1024 -Wno-main -Wno-dangling-pointer -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-stringop-overflow -Wno-array-bounds -Wno-alloc-size-larger-than -Wimplicit-fallthrough=5 -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wenum-conversion -Wextra -Wunused -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-packed-not-aligned -Wno-format-overflow -Wno-format-truncation -Wno-stringop-truncation -Wno-override-init -Wno-missing-field-initializers -Wno-type-limits -Wno-shift-negative-value -Wno-maybe-uninitialized -Wno-sign-compare -Wno-unused-parameter -g -gdwarf-5  -fsanitize=bounds-strict -fsanitize=shift -fsanitize=bool -fsanitize=enum  -fsanitize=signed-integer-overflow    -DKBUILD_MODFILE='"drivers/base/power/sysfs"' -DKBUILD_BASENAME='"sysfs"' -DKBUILD_MODNAME='"sysfs"' -D__KBUILD_MODNAME=kmod_sysfs -c -o drivers/base/power/sysfs.o drivers/base/power/sysfs.c   ; ./tools/objtool/objtool --hacks=jump_label --hacks=noinstr --hacks=skylake --retpoline --rethunk --sls --stackval --static-call --uaccess --prefix=16   drivers/base/power/sysfs.o
这里边的.c  一看就知道很重要-o drivers/base/power/sysfs.o drivers/base/power/sysfs.c

当全量编译完成,就可以把所有的用到的.c文件找到了。但有另一个问题,就是.h文件不容易找到,因为一个c文件有时候会依赖好几十个h文件

这里找到编译用到的所有.c文件,而源代码所有的.c文件本来就是有的

linux下可以用diff命令或beyondcompare,推荐后者,可以容易的找到多余的.c列表,写入到一个txt,然后rm -rf `cat xxx.txt`

而头文件的清理则是非常复杂,还没有找到好的方案。

原来用过的一个非常笨的办法,就是把所有头文件删除,然后编译,确哪个, 就git checkout 回来,不过这个办法有点费人。

在头文件减少这块,当前还未想到非常好的办法:

1 把所有头文件先提交到git仓库,然后本地删除头文件,编译的时候报头文件找不到用,用git status | grep xxxx.h,然后再通过git checkout xxx.h把xxx.h下载下来,这样,这样操作好处是不会有多余的头文件,坏处是非常耗费时间。

2 修改gcc/g++编译器源代码,每个c文件编译时,把编译时使用的头文件列表记录下来,然后把所有的汇总,最后把不使用的删除。这个方法不知道是否可行,编译器在编译的时候一般会在很多头文件目录去搜索,编译器会知道最终编译时所使用的头文件,及头文件所在目录,这样项目编译完成,就会记录所有的头文件,然后把不用的头文件删除。

个人的一点浅见。

感谢阅读。

参考

Linux 内核编译 —— make localmodconfig 简化内核配置流程-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值