Esiste un modo efficace (magari abusando del preprocessore gcc?) Per ottenere un set di fonti del kernel spogliate in cui non viene lasciato tutto il codice non necessario in base a .config?Sorgere i sorgenti del kernel Linux in base al file .config
risposta
Bene ha ottenuto alcuni passaggi in una soluzione.
primo luogo, si può ottenere i comandi compilatore utilizzate da
make KBUILD_VERBOSE=1 | tee build.log
grep '^ gcc' build.log
Per ora, seleziono unica linea di comando una gcc per ulteriori passi. Per esempio la compilazione di kernel/kmod.c, sembra che:
gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c
ora rimuovere l'opzione -c
, -o ...
e aggiungi -E
, disabilitando così la compilazione e la scrittura di uscita preprocessore sullo schermo. Inoltre aggiungo -fdirectives-only
per impedire l'espansione delle macro e -undef
per rimuovere le definizioni delle macro definite da GNU. -nostdinc
per rimuovere le intestazioni c standard è già stato aggiunto dal makefile del kernel.
Ora i inclusi sono ancora inclusi e quindi espansi sull'output del preprocessore. Così ho pipe il file di input tramite grep rimuovendoli: grep -v '#include' kernel/kmod.c
. Ora è rimasto solo un inclusione: autoconf.h è incluso nella riga di comando di Makefile. Questo è ottimo in quanto definisce in realtà le macro utilizzate da #ifdef CONFIG_...
per selezionare il codice del kernel attivo.
L'unica cosa rimasta è filtrare i commenti del preprocessore e il rimanente #define
da autoconf.h tramite grep -v '^#'
.
L'intera tubazione assomiglia:
grep -v '#include' kernel/kmod.c | gcc -E -fdirectives-only -undef <ORIGINAL KERNEL BUILD GCC OPTIONS WITHOUT -c AND -o ...> - |grep -v '^#'
e il risultato è una versione filtrata del kernel/kmod.c contenente il codice che in realtà è costruire in kmod.o.
Le domande rimangono: come fare per l'intero albero dei sorgenti? Ci sono file che sono effettivamente costruiti ma mai usati e spogliati durante il collegamento?
Compilare tutto e utilizzare atime per scoprire quali file non sono stati utilizzati. Potrebbe non essere molto preciso, ma probabilmente vale la pena provare.
Questo non funzionerà in quanto molte istruzioni di #ifdef ... vengono valutate all'interno dei file di origine, quindi i file inutilizzati e i file quasi inutilizzati sono anch'essi compilati. – dronus
@dronus: Questo è l'unico modo semplice in cui riesco a pensare (Il prossimo è, in pratica, scrivere o modificare un preprocessore C). Dovrebbe rimuovere cose come moduli e archi inutilizzati. Hai davvero bisogno che sia più preciso? Cosa stai cercando di ottenere? –
Beh, mi piacerebbe solo avere una panoramica affidabile su come funziona il kernel, ma è quasi impossibile leggere centinaia di MB di codice. Quindi mi piace costruire un kernel minimale e leggere il vero codice usato. – dronus