2011-09-08 17 views

Odpowiedz

2

Cóż, kilka kroków do rozwiązania.

Po pierwsze, można uzyskać używanych poleceń kompilatora przez

make KBUILD_VERBOSE=1 | tee build.log 
grep '^ gcc' build.log 

Na razie mogę wybrać tylko jeden wiersz polecenia gcc do dalszych kroków. Na przykład kompilacji jądra/kmod.c, wygląda na to:

gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c 

teraz usunąć opcję -c, -o ... i dodać -E, tym samym wyłączając kompilację i pisanie wyjście preprocesora do ekranu. Ponadto dodaję -fdirectives-only, aby zapobiec rozszerzaniu makr i -undef, aby usunąć definicje makr zdefiniowane przez GNU. -nostdinc w celu usunięcia standardowych nagłówków c jest już dodanych przez plik Makefile jądra.

Teraz zawiera ciągle włączone, a zatem rozszerzony na wyjściu preprocesora. W ten sposób przesyłam plik wejściowy przez grep, usuwając je: grep -v '#include' kernel/kmod.c. Teraz pozostaje tylko jeden element include: autoconf.h jest zawarty w linii poleceń Makefile. Jest to świetne, ponieważ w rzeczywistości definiuje makra używane przez #ifdef CONFIG_... do wybierania aktywnego kodu jądra.

Pozostaje tylko odfiltrować komentarze preprocesora i pozostałe #define s z autoconf.h za pomocą grep -v '^#'.

Cała rura wygląda następująco:

grep -v '#include' kernel/kmod.c | gcc -E -fdirectives-only -undef <ORIGINAL KERNEL BUILD GCC OPTIONS WITHOUT -c AND -o ...> - |grep -v '^#' 

a wynik jest filtrowany wersja jądra/kmod.c zawierający kod, który jest faktycznie zbudować w kmod.o.

pytania pozostają: Jak to zrobić dla całego drzewa źródłowego? Czy istnieją pliki, które są faktycznie kompilowane, ale nigdy nie używane i pozbawione połączenia?

0

Kompilacja wszystko i wykorzystać atime, aby dowiedzieć się, które pliki nie były używane. Może nie być bardzo dokładne, ale prawdopodobnie warto spróbować.

+0

To nie będzie działać jak najwięcej #ifdef ... wypowiedzi są oceniane wewnątrz pliki źródłowe więc nieużywane pliki i prawie nieużywane pliki są kompilowane też. – dronus

+0

@dronus: To jedyny prosty sposób, jaki mogę wymyślić (następny to, w zasadzie, pisanie lub modyfikowanie preprocesora C). Powinno to usunąć takie rzeczy jak nieużywane moduły i archiwa. Czy naprawdę potrzebujesz go, by był dokładniejszy? Co próbujesz osiągnąć? –

+1

Cóż, po prostu lubię uzyskać pewne informacje na temat działania jądra, ale prawie niemożliwe jest odczytanie 100 MB kodu. Więc lubię budować minimalne jądro i czytać jego prawdziwy kod. – dronus

Powiązane problemy