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.
- 1. Come config da immagine del kernel Linux
- 2. quella che è la "corrente" in linux sorgenti del kernel
- 3. Linux: ordina i file in base al nome (nessun delimitatore)
- 4. Programmazione del modulo del kernel Linux: makefile
- 5. Copertura del codice kernel Linux - GCOV
- 6. Divisione di un file in linux in base al contenuto
- 7. Simboli del kernel Linux esportati
- 8. Modulo Kernel Linux (* .ko) compatibilità tra i kernel
- 9. Organizzazione delle intestazioni del kernel Linux
- 10. Come velocizzare la compilazione del kernel Linux?
- 11. La compilazione del modulo del kernel Linux non riesce
- 12. Stile di codifica del kernel Linux
- 13. Compilare l'errore del kernel Linux xt_CONNMARK.h
- 14. Inserire i dati locali nel modulo del kernel linux
- 15. Shutdown (incorporato) linux dallo spazio del kernel
- 16. Attività periodica in un modulo del kernel Linux
- 17. mprotect() come funzionalità all'interno del kernel Linux
- 18. Come configurare il kernel Linux in Buildroot?
- 19. Come codificare un modulo del kernel Linux?
- 20. per lo sviluppo del kernel linux
- 21. Come caricare automaticamente un modulo del kernel in Gentoo Linux?
- 22. file esiste in base al nome del file di pattern
- 23. Come passare un valore al modulo del kernel Linux incorporato al momento dell'avvio?
- 24. su typecheck nel kernel linux
- 25. kernel Linux makescile cscope target
- 26. come comunicare i programmi - kernel kernel kernel monolitico kernel exo
- 27. In che modo linux-kernel legge il file proc/pid?
- 28. Ambiente virtuale per Linux Kernel hacking
- 29. Ottenere le informazioni di debug del kernel di Linux dopo l'arresto del kernel
- 30. Android: come ottenere i log del kernel dopo il panico del kernel?
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