Is there any efficient way (maybe by abusing the gcc preprocessor?) to get a set of stripped kernel sources where all code not needed according to .config is left out?
相关问题
- Is shmid returned by shmget() unique across proces
- how to get running process information in java?
- Creating a script to use Google Closure for multip
- Error building gcc 4.8.3 from source: libstdc++.so
- Why should we check WIFEXITED after wait in order
Compile everything and use atime to find out which files were not used. It might not be very accurate but it's probably worth a try.
Well got some steps into a solution.
First, one can obtain the used compiler commands by
For now, I select only one gcc command line for further steps. For example the build of kernel/kmod.c, it looks like:
I now remove the option
-c
,-o ...
and add-E
, thus disabling compilation and writing preprocessor output to the screen. Further I add-fdirectives-only
to prevent macro expansion and-undef
to remove the GNU defined macro definitions.-nostdinc
to remove the standard c headers is already added by the kernel makefile.Now includes are still included and thus expanded on the preprocessor output. Thus I pipe the input file through grep removing them:
grep -v '#include' kernel/kmod.c
. Now only one include is left: autoconf.h is included by the Makefile's command line. This is great as it actually defines the macros used by#ifdef CONFIG_...
to select the active kernel code.The only thing left is to filter out the preprocessor comments and the remaining
#define
s from autoconf.h by means ofgrep -v '^#'
.The whole pipe looks like:
and the result is a filtered version of kernel/kmod.c containing the code that is actually build into kmod.o.
Questions remain: How to do that for the whole source tree? Are there files that are actually build but never used and stripped at linking?
Kernel Minimization Script :
A project inspired by this question and providing an easy answer... It contains a Python script that generate a minimized sources code during build time. The new minimized source tree will only contain used sources. (project page)
Info :
The script is tested working with the kernel v4.14.x, however building the kernel one more time from those generated minimized sources require to copy make files and Kconfig files etc... at least we could easily isolate only used source for investigations and development
Usage :
Note & Reminder :
If we are building within and against the targeted machine, we also have the
make localmodconfig
command that shrink the current config file with only the currently used modules, if used before "Minimization" it will generate further more stripped sources