2011-09-08 21 views

risposta

2

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?

0

Compilare tutto e utilizzare atime per scoprire quali file non sono stati utilizzati. Potrebbe non essere molto preciso, ma probabilmente vale la pena provare.

+0

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

+0

@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? –

+1

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

Problemi correlati