강좌 & 팁
글 수 2,412
2011.01.14 18:53:25 (*.138.143.120)
45728
커널 컴파일
이 글은 커널 컴파일을 하는데 있어서 옵션과 그 방법들에 대한 글입니다.
먼저 최신 커널을 다운받는다.
2011.1.13일자 최신 커널 stable 버전은 2.6.37 이며
git 주소 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 에서 다운 받을수 있다.
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
시간이 많이 걸릴수 있으므로 알아서 준비하자.
먼저 eabi 컴파일이 가능한 컴파일러를 하나 준비한다.
환경변수에 ARCH 와 CROSS_COMPILE 을 잡아 놓으면 매우 편하다.
export CROSS_COMPILE=arm-none-eabi- ARCH=arm
일단 README 라는 파일이 있다.
괞히 있는 것이 아니라 친절한 설명을 해 놓은 것으므로 항상 읽어주는 센스를 발휘하자.
여기에는 다운받은 커널이 압축파일일 경우 압축을 푸는 방법을 tar.gz / bz2 파일 모두 설명해 준다.
65 gzip -cd linux-2.6.XX.tar.gz | tar xvf -
66
67 or
68 bzip2 -dc linux-2.6.XX.tar.bz2 | tar xvf -
패치하는 방법도 같이 설명해 준다.
83 gzip -cd ../patch-2.6.xx.gz | patch -p1
84
85 or
86 bzip2 -dc ../patch-2.6.xx.bz2 | patch -p1
알겠지만 --dry-run 이 무슨 옵션인지 위와 같은 패치 작업을 할때는 아는 것이 중요하다.
이 옵션은 실제 파일에 적용은 하지 않고 실행 결과를 프린트해준다.
무언가 중요한 잘못을 저질렀을때 파일을 복구하는 방법도 있지만 귀찮은 일을 하지 않게 예방해주고
결행을 할것인지 말것인지 판단하게 해준다.
자 이제 커널 빌드를 해 본다.
많이 해본신 분들은 잘 아시겠지만 커널 빌드시에 생기는 오브젝트 파일들은 VI 로 작업시나 grep 신공시에
시간을 많이 걸리게 합니다.
그래서 그런 귀찮은 파일들은 한군데로 보내 버리는 옵션이 있습니다.
output dir 의 위치를 지정하는 것이죠
바닐라 커널을 방금 다운 받은 상태에서 아래와 같이 진행합니다.
현재의 정보를 확인합니다.
root@boggle70-desktop:linux-2.6# du ./
1174160 ./
약 1.2 G 정도입니다.
root@boggle70-desktop:linux-2.6# git status
# On branch master
nothing to commit (working directory clean)
root@boggle70-desktop:linux-2.6#
이제 설정과 컴파일을 진행해 봅니다.
대신 출력 디렉토리를 지정하는 옵션을 주고 진행합니다.
root@boggle70-desktop:linux-2.6# make O=../s5pv210/ s5pv210_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/docproc
GEN /work/kernel/temp/build/Makefile
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/lex.zconf.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
root@boggle70-desktop:linux-2.6# make O=../s5pv210/ zImage
컴파일이 끝났습니다.
이제 다시 현재 디렉토리의 정보를 보겠습니다.
root@boggle70-desktop:linux-2.6# du ./
1174160 ./
그대로군요
root@boggle70-desktop:linux-2.6# git status
# On branch master
nothing to commit (working directory clean)
root@boggle70-desktop:linux-2.6#
네... 수정되거나 추가된 파일이 전혀 없습니다.
root@boggle70-desktop:linux-2.6# make O=../build/ menuconfig
을 통해서 수정을 해도 역시 동일합니다.
이제 의문이 생깁니다.
현재 상태에서 다른 디렉토리에 다른 타겟으로 컴파일이 가능할까?
한번 시도해 보니다.
s5p64x0_defconfig 을 컴파일 해 봅니다.
root@boggle70-desktop:linux-2.6# make O=../s3c6410 s5p64x0_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/docproc
GEN /work/kernel/ttt/s3c6410/Makefile
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/lex.zconf.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
root@boggle70-desktop:linux-2.6# make O=../s3c6410 menuconfig
GEN /work/kernel/ttt/s3c6410/Makefile
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/mconf.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.
root@boggle70-desktop:linux-2.6# make O=../s3c6410 zImage
컴파일은 완료되었고 현재 디렉토리 상태를 확인합니다.
root@boggle70-desktop:linux-2.6# du ./
1174160 ./
root@boggle70-desktop:linux-2.6# git status
# On branch master
nothing to commit (working directory clean)
root@boggle70-desktop:linux-2.6#
여전히 현재의 디렉토리에는 전혀 변화한 것이 없습니다.
커널 소스는 아주 깨끗하게 관리가 되며 빌드디렉토리를 따로 두어 관리할수 있습니다.
마지막으로 커널 빌드시에 -j 옵션을 주면 단일 컴파일이 아닌 병렬 컴파일을
진행하게 해준다.
root@boggle70-desktop:linux-2.6# make O=../s3c6410 zImage -j 4 와 같이 해주면 된다.
-j 뒤의 숫자는 자신의 cpu core 갯수와 비슷하게 하면 됩니다.
혹스 2.6.x 이전의 2.4.x 버전의 컴파일 모습을 보고 싶다면 ( 좀더 많은 경로와 정보가 표시되는)
V=1 을 사용하면 됩니다.
root@boggle70-desktop:linux-2.6# make O=../s3c6410 -j 4 zImage V=1