■ make bzimage를 실행 했을 때 실행되는 순서를 Makefile 기준으로 분석


(1) make bzimage 순서 정리

○ $(TOPDIR)/Makefile에 포함된 $(TOPDIR)/arch/i386/Makefile에 있는 'bzimage:'로부터 시작

○ 의존 관계에 의해 vmlinux가 먼저 만들어짐. 이때 vmlinux가 만들어지면 $(TOPDIR)/arch/i386/boot로 이동해 계속 진행

○ vmlinux의 진행

○ 의존 관계에 의해 version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs가 먼저 만들어짐

○ 의존 관계에 의한 만들기가 끝나면 $(TOPDIR)/vmlinux가 만들어짐

○ 의존 관계에 의해 $(CONFIGURE) bbootsect bsetup compressed/bvmlinux tools/build가 만들어진다

○ compressed/bvmlinux의 진행. 의존 관계에 의해 piggy.o $(OBJECTS)가 먼저 만들어짐

○ piggy.o는 $(TOPDIR)/vmlinux를 압축해 만든다.

※ 순서대로 나열했지만 Makefile의 특성상 하나를 만들기 전에 이미 다른 것이 먼저 만들어져야하는 등의 의존 관계가 있기 때문에 순서가 뒤집힌 것처럼 보일 것이다. 이를 바로 잡아 먼저 만들어지는 순으로 나열해보면 아래와 같다.


(2) 생성 순으로 정리

vmlinux
  -
include/linux/version.h
  -
init/main.o
  -
init/version.o
  -
linuxsubidrs(fs lib mm ipc kernel drivers net)

bzimage 
  -
bbootsect
  -
bsetup
  -
compressed/bvmlinux
       
piggy.o
       
head.o
       
misc.o
  -
tools/build


(3) Log
: Makefile을 통해 분석된 것을 이제는 실예를 사용해 분석해보자. 아래 Log는 'make bzImage 2>&1 | tee log-bzImage.txt'를 사용해 얻은 것이다. 전체는 필요 없는 부분이 너무 많기 때문에 필요 없는 부분은 삭제하거나 축약하고 실었다.

 

(1) main.o
gcc -D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4    -c -o init/main.o init/main.c
. scripts/mkversion > .tmpversion

(2) version.o
gcc -D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4   -DUTS-MACHINE='"i386"' -c -o init/version.o init/version.c
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  kernel

(3) kernel
gcc -D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4   -DUTS-MACHINE='"i386"' -c -o init/version.o init/version.c
make[1]: 들어감 `/usr/src/linux-2.4.16/kernel' 디렉토리
make all-targets
make[2]: 들어감 `/usr/src/linux-2.4.16/kernel' 디렉토리
rm -f kernel.o
ld -m elf-i386  -r -o kernel.o sched.o dma.o fork.o exec-domain.o panic.o printk.o module.o exit.o itimer.o info.o time.o softirq.o resource.o sysctl.o acct.o capability.o ptrace.o timer.o user.o signal.o sys.o kmod.o context.o uid16.o ksyms.o pm.o
make[2]: 나감 `/usr/src/linux-2.4.16/kernel' 디렉토리
make[1]: 나감 `/usr/src/linux-2.4.16/kernel' 디렉토리

(4) drivers
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  drivers
make[1]: 들어감 `/usr/src/linux-2.4.16/drivers' 디렉토리
make[1]: 나감 `/usr/src/linux-2.4.16/drivers' 디렉토리

(5) mm
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  mm
make[1]: 들어감 `/usr/src/linux-2.4.16/mm' 디렉토리
make all-targets
make[2]: 들어감 `/usr/src/linux-2.4.16/mm' 디렉토리
rm -f mm.o
ld -m elf-i386  -r -o mm.o memory.o mmap.o filemap.o mprotect.o mlock.o mremap.o vmalloc.o slab.o bootmem.o swap.o vmscan.o page-io.o page-alloc.o swap-state.o swapfile.o numa.o oom-kill.o shmem.o
make[2]: 나감 `/usr/src/linux-2.4.16/mm' 디렉토리
make[1]: 나감 `/usr/src/linux-2.4.16/mm' 디렉토리

(6) fs
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  fs
make[1]: 들어감 `/usr/src/linux-2.4.16/fs' 디렉토리
rm -f fs.o
ld -m elf-i386  -r -o fs.o open.o read-write.o devices.o file-table.o buffer.o super.o block-dev.o char-dev.o stat.o exec.o pipe.o namei.o fcntl.o ioctl.o readdir.o select.o fifo.o locks.o dcache.o inode.o attr.o bad-inode.o file.o iobuf.o dnotify.o filesystems.o namespace.o seq-file.o noquot.o binfmt-script.o binfmt-elf.o proc/proc.o partitions/partitions.o ext2/ext2.o isofs/isofs.o nls/nls.o autofs4/autofs4.o devpts/devpts.o jfs/jfs.o
make[1]: 나감 `/usr/src/linux-2.4.16/fs' 디렉토리

(7) net
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  net
make[1]: 들어감 `/usr/src/linux-2.4.16/net' 디렉토리
make[1]: 나감 `/usr/src/linux-2.4.16/net' 디렉토리

(8) ipc
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  ipc
make[1]: 들어감 `/usr/src/linux-2.4.16/ipc' 디렉토리
make all-targets
make[2]: 들어감 `/usr/src/linux-2.4.16/ipc' 디렉토리
rm -f ipc.o
ld -m elf-i386  -r -o ipc.o util.o msg.o sem.o shm.o
make[2]: 나감 `/usr/src/linux-2.4.16/ipc' 디렉토리
make[1]: 나감 `/usr/src/linux-2.4.16/ipc' 디렉토리

(9) lib
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  lib
make[1]: 들어감 `/usr/src/linux-2.4.16/lib' 디렉토리
make all-targets
make[2]: 들어감 `/usr/src/linux-2.4.16/lib' 디렉토리
rm -f lib.a
ar  rcs lib.a errno.o ctype.o string.o vsprintf.o brlock.o cmdline.o bust-spinlocks.o rbtree.o rwsem.o dec-and-lock.o
make[2]: 나감 `/usr/src/linux-2.4.16/lib' 디렉토리
make[1]: 나감 `/usr/src/linux-2.4.16/lib' 디렉토리

(10) arch/i386/kernel
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  arch/i386/kernel
make[1]: 들어감 `/usr/src/linux-2.4.16/arch/i386/kernel' 디렉토리
rm -f kernel.o
ld -m elf-i386  -r -o kernel.o process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys-i386.o pci-dma.o i386-ksyms.o i387.o bluesmoke.o dmi-scan.o pci-i386.o pci-pc.o pci-irq.o mtrr.o apm.o mpparse.o apic.o nmi.o io-apic.o acpitable.o
gcc -D--ASSEMBLY-- -D--KERNEL-- -I/usr/src/linux-2.4.16/include -traditional -c head.S -o head.o
gcc -D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4     -c -o init-task.o init-task.c
make[1]: 나감 `/usr/src/linux-2.4.16/arch/i386/kernel' 디렉토리

(11) arch/i386/mm
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  arch/i386/mm
make[1]: 들어감 `/usr/src/linux-2.4.16/arch/i386/mm' 디렉토리
make all-targets
make[2]: 들어감 `/usr/src/linux-2.4.16/arch/i386/mm' 디렉토리
rm -f mm.o
ld -m elf-i386  -r -o mm.o init.o fault.o ioremap.o extable.o
make[2]: 나감 `/usr/src/linux-2.4.16/arch/i386/mm' 디렉토리
make[1]: 나감 `/usr/src/linux-2.4.16/arch/i386/mm' 디렉토리

(12) arch/i386/lib
make CFLAGS="-D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  " -C  arch/i386/lib
make[1]: 들어감 `/usr/src/linux-2.4.16/arch/i386/lib' 디렉토리
make all-targets
make[2]: 들어감 `/usr/src/linux-2.4.16/arch/i386/lib' 디렉토리
rm -f lib.a
ar  rcs lib.a checksum.o old-checksum.o delay.o usercopy.o getuser.o memcpy.o strstr.o mmx.o
make[2]: 나감 `/usr/src/linux-2.4.16/arch/i386/lib' 디렉토리
make[1]: 나감 `/usr/src/linux-2.4.16/arch/i386/lib' 디렉토리

(13) vmlinux
ld -m elf-i386 -T /usr/src/linux-2.4.16/arch/i386/vmlinux.lds -e stext arch/i386/kernel/head.o arch/i386/kernel/init-task.o init/main.o init/version.o \
--start-group \
arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o \
drivers/acpi/acpi.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/char/agp/agp.o drivers/char/drm/drm.o drivers/ide/idedriver.o drivers/cdrom/driver.o drivers/sound/sounddrivers.o drivers/pci/driver.o drivers/pcmcia/pcmcia.o drivers/net/pcmcia/pcmcia-net.o drivers/pnp/pnp.o drivers/video/video.o drivers/md/mddev.o \
net/network.o \
/usr/src/linux-2.4.16/arch/i386/lib/lib.a /usr/src/linux-2.4.16/lib/lib.a /usr/src/linux-2.4.16/arch/i386/lib/lib.a \
--end-group \
-o vmlinux
nm vmlinux | grep -v '\(compiled\)\|\(\.o$\)\|\( [aUw] \)\|\(\.\.ng$\)\|\(LASH[RL]DI\)' | sort > System.map

(14) bbootsect
make[1]: 들어감 `/usr/src/linux-2.4.16/arch/i386/boot' 디렉토리
gcc -E -D--KERNEL-- -I/usr/src/linux-2.4.16/include -D--BIG-KERNEL-- -traditional -DSVGA-MODE=NORMAL-VGA  bootsect.S -o bbootsect.s
as -o bbootsect.o bbootsect.s
bbootsect.s: Assembler messages:
bbootsect.s:257: Warning: indirect lcall without `*'
ld -m elf-i386 -Ttext 0x0 -s --oformat binary bbootsect.o -o bbootsect

(15) bsetup
gcc -E -D--KERNEL-- -I/usr/src/linux-2.4.16/include -D--BIG-KERNEL-- -D--ASSEMBLY-- -traditional -DSVGA-MODE=NORMAL-VGA  setup.S -o bsetup.s
as -o bsetup.o bsetup.s
bsetup.s: Assembler messages:
bsetup.s:1716: Warning: indirect lcall without `*'
ld -m elf-i386 -Ttext 0x0 -s --oformat binary -e begtext -o bsetup bsetup.o

(16) arch/i386/boot/compressed/piggy.o
make[2]: 들어감 `/usr/src/linux-2.4.16/arch/i386/boot/compressed' 디렉토리
tmppiggy=-tmp-$$piggy; \
rm -f $tmppiggy $tmppiggy.gz $tmppiggy.lnk; \
objcopy -O binary -R .note -R .comment -S /usr/src/linux-2.4.16/vmlinux $tmppiggy; \
gzip -f -9 < $tmppiggy > $tmppiggy.gz; \
echo "SECTIONS { .data : { input-len = .; LONG(input-data-end - input-data) input-data = .; *(.data) input-data-end = .; }}" > $tmppiggy.lnk; \
ld -m elf-i386 -r -o piggy.o -b binary $tmppiggy.gz -b elf32-i386 -T $tmppiggy.lnk; \
rm -f $tmppiggy $tmppiggy.gz $tmppiggy.lnk

(17) arch/i386/boot/compressed/head.o
gcc -D--ASSEMBLY-- -D--KERNEL-- -I/usr/src/linux-2.4.16/include -traditional -c head.S

(18) arch/i386/boot/compressed/misc.o
gcc -D--KERNEL-- -I/usr/src/linux-2.4.16/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4  -c misc.c

(19) arch/i386/boot/compressed/bvmlinux.o
ld -m elf-i386 -Ttext 0x100000 -e startup-32 -o bvmlinux head.o misc.o piggy.o
make[2]: 나감 `/usr/src/linux-2.4.16/arch/i386/boot/compressed' 디렉토리

(20) build
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o tools/build tools/build.c -I/usr/src/linux-2.4.16/include

(21) bvmlinux.out
objcopy -O binary -R .note -R .comment -S compressed/bvmlinux compressed/bvmlinux.out

(22) bzImage
tools/build -b bbootsect bsetup compressed/bvmlinux.out CURRENT > bzImage
Root device is (3, 1)
Boot sector 512 bytes.
Setup is 4768 bytes.
System is 899 kB
make[1]: 나감 `/usr/src/linux-2.4.16/arch/i386/boot' 디렉토리


위에 열거한 것과 같이 실제 컴파일에서의 순서가 명확하게 나왔다. drivers와 같은 단계에선 하위 디렉토리가 무척 많아 여러 디렉토리를 컴파일하는데 그런 것들은 모두 생략했다.

'L inux > Kernel' 카테고리의 다른 글

menuconfig - 리눅스 커널 설정 (1)  (0) 2011.12.15
openWRT  (1) 2011.11.02
Kernel Makefile - bzimage가 만들어지는 과정  (0) 2011.10.05
커널 이미지 파일의 구조  (0) 2011.10.05
Grub - 부팅환경설정 파일  (0) 2011.10.05
by 민트앤라떼 2011. 10. 6. 09:44