2011-09-08 5 views

답변

2

글쎄 솔루션에 몇 가지 단계가있어.

첫째, 하나는 내가 추가 단계에 대해 하나 개의 GCC 명령 행을 선택, 지금

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

에 의해 사용 된 컴파일러 명령을 얻을 수 있습니다. 지금 옵션 -c, -o ...를 제거하고 -E를 추가하여 컴파일을 해제하고 화면에 전 처리기 출력을 작성

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

: 같은 예를 들어 커널/kmod.c의 빌드, 그것은 보인다. 또한 매크로 확장을 방지하기 위해 -fdirectives-only을 추가하고 -undef은 GNU 정의 매크로 정의를 제거합니다. -nostdinc 표준 커널 헤더를 제거하려면 커널 메이크 파일에서 이미 추가되어 있어야합니다.

이제 includes가 여전히 포함되어 전 처리기 출력으로 확장됩니다. 따라서 grep을 통해 입력 파일을 파이프 처리하여 파이프를 제거합니다 : grep -v '#include' kernel/kmod.c. 이제 하나의 include 만 남아 있습니다 : autoconf.h는 Makefile의 명령 행에 포함됩니다. 이것은 실제로 활성 커널 코드를 선택하기 위해 #ifdef CONFIG_...이 사용하는 매크로를 정의하므로 유용합니다.

남아있는 유일한 문제는 grep -v '^#'을 사용하여 전 처리기 주석과 나머지 #define을 autoconf.h에서 필터링하는 것입니다. 실제로 kmod.o.에 구축되어있는 코드를 포함하는 커널/kmod.c의 필터링 된 버전이

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

및 결과 : 같은

전체 파이프 본다

질문 : 전체 소스 트리에 대해 어떻게해야합니까? 실제로 빌드되었지만 결코 사용되지 않고 연결 해제 된 파일이 있습니까?

0

모든 것을 컴파일하고 atime을 사용하여 사용되지 않은 파일을 찾습니다. 그것은 매우 정확하지는 않지만 아마도 시도할만한 가치가있을 것입니다.

+0

많은 #ifdef ... 문이 소스 파일 내에서 평가되므로 사용하지 않는 파일과 거의 사용되지 않는 파일도 컴파일되므로이 작업을 수행 할 수 없습니다. – dronus

+0

@dronus : 그게 내가 생각할 수있는 유일한 간단한 방법이다 (다음은 기본적으로 C 전처리기를 작성하거나 수정하는 것이다). 사용하지 않는 모듈과 아치 같은 것을 제거해야합니다. 좀 더 정확 해지기를 정말로 필요합니까? 무엇을 성취하려고합니까? –

+1

글쎄, 나는 커널이 어떻게 작동하는지에 대한 약간의 개요를 얻고 싶지만 백개의 MB를 읽는 것은 거의 불가능하다. 그래서 최소한의 커널을 만들고 실제 사용 된 코드를 읽는 것을 좋아합니다. – dronus

관련 문제