
전처리 코드 생성
리눅스 커널 소스코드를 분석하다 보면 수많은 매크로를 만나게 된다.
리눅스 커널을 캡슐화나 다형성과 같은 객체지향 방식으로 구현하다 보니 매크로로 구현된 코드가 많다.
그런데, 이 매크로들이 소스 분석의 걸림돌이 되기 때문에 전처리 코드로 이러한 매크로들을 풀 수 있다.
전처리 코드는 GCC 컴파일 오브젝트를 생성하는 과정에서 추출되고, 방식은 크게 2가지가 있다.
- 전체 전처리 파일을 추출
- 특정 전처리 파일을 추출
전체 전처리 파일을 추출하는 방법
리눅스 커널의 전체 소스코드를 전처리 파일로 추출하기 위해서는 Makefile을 수정해야 한다.
아래 부분의 빨간 줄을 추가하면 된다.

전처리 파일을 추출하기 위해 커널 빌드를 다시 수행해야 한다. (build_kernel.sh 실행)

아래 글에서 커널 빌드 내용을 볼 수 있다.
라즈비안 OS 커널 소스 설치 및 빌드
앞으로 "김동현"님의 [디버깅을 통해 배우는 리눅스 커널의 구조와 원리] 책을 공부하며, 공부한 내용을 정리해보려고 한다. 책에서는 라즈베리파이를 가지고 내용이 진행되는데, 나는 VMWare에
seongmoahn.tistory.com
전처리 코드는 out 디렉터리에 생성된다.
또, 전처리 코드는 소스 파일명 앞에 ".tmp_"란 접두사와 ".i" 확장자가 붙는다.

하지만 이렇게 모든 코드에 대해 전처리 작업을 하면 ".i" 파일뿐만 아니라 ".s" 파일도 생성돼 용량이 매우 커진다.
그러니 특정 파일만 전처리 작업을 하는 방법도 알아보자.
특정 전처리 파일을 추출하는 방법
일단 이전에 수정한 Makefile 내용을 다시 삭제하자.
특정 파일을 전처리 작업하기 위한 스크립트 파일도 만들자. (build_preprocess_kernel.sh)
#!/bin/bash
echo "configure build output path"
KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
OUTPUT="$KERNEL_TOP_PATH/out"
echo "$OUTPUT"
KERNEL=kernel7
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
BUILD_LOG="$KERNEL_TOP_PATH/rpi_preprocess_build_log.txt"
PREPROCESS_FILE=$1
echo "build preprocessed file: $PREPROCESS_FILE"
echo "move kernel source"
cd linux
echo "make defconfig"
make O=$OUTPUT bcm2709_defconfig
echo "kernel build"
time make $PREPROCESS_FILE O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG
전에 만들었던 build_kernel.sh 파일에서 몇 줄을 추가했다.
- PREPROCESS_FILE=$1 : 첫 번째 인자를 전처리할 파일로 지정
- make $PREPROCESS_FILE O=$OUTPUT zImage modules dtbs -j4 2>&1 : 전처리 파일을 지정해 커널 빌드
# 스크립트 파일 실행 권한 추가
chmod +x build_preprocess_kernel.sh
위 스크립트를 실행할 때는 디렉터리를 포함한 파일 이름을 지정해야 한다.
./build_preprocess_kernel.sh [파일명]
근데 실행이 안된다...
이유를 찾아봐야겠다.
'Linux > Linux Kernel' 카테고리의 다른 글
커널 디버깅 맛보기 (2) | 2025.04.06 |
---|---|
리눅스 커널 소스의 구조 및 objdump 바이너리 유틸리티 (0) | 2025.04.01 |
라즈비안 OS 커널 소스 설치 및 빌드 (0) | 2025.04.01 |