2.5. ´Ü°èº° ÀÚ¼¼ÇÑ ºÐ¼®

2.5.1. -Ttext 0x0ÀÇ ÀǹÌ

¿©±â¼­ -Ttext 0x0¿¡ ´ëÇØ Á» ¾Ë¾Æº¸ÀÚ.

.text

.global -start
-start:
test-val: .long test-data
	nop	
test-data:	.word 0xaa55

À§¿Í °°Àº Äڵ带 'gcc -E -traditional -o test.s test.S'·Î ÄÄÆÄÀÏ Çϸé

# 1 "test.S"
.text

.global -start
-start:
test-val: .long test-data
	nop	
test-data:	.word 0xaa55

ÀÌ·¸°Ô µÇ°í À̸¦ ´Ù½Ã 'as -o test.o test.s'·Î ¾î¼ÀºíÇϴµ¥ -a¸¦ »ç¿ëÇØ Áß°£ ÆÄÀÏÀ» ¾òÀ¸¸é ´ÙÀ½°ú °°´Ù.

GAS LISTING test.s 			page 1


   1              	# 1 "test.S"
   2              	.text
   3              	
   4              	.global -start
   5              	-start:
   6 0000 05000000 	test-val: .long test-data
   7 0004 90       		nop	
   8 0005 55AA     	test-data:	.word 0xaa55
   9 0007 90       	
AS LISTING test.s 			page 2


DEFINED SYMBOLS
              test.s:5      .text:00000000 -start
              test.s:6      .text:00000000 test-val
              test.s:8      .text:00000005 test-data

NO UNDEFINED SYMBOLS

test-val¿¡ ÀúÀåµÈ °ªÀº test-dataÀÇ .textÀÇ ½ÃÀÛÁ¡¿¡¼­ ºÎÅÍÀÇ offsetÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ ½ÃÀÛÀÎ 0¿¡¼­ ºÎÅÍ 5¹øÂ°¿¡ ÀÖ´Ü ¼Ò¸®´Ù.

ÃÖÁ¾ÀûÀ¸·Î 'ld -m elf-i386 -s --oformat binary test.o -o test.1'ÇÑ °á°ú¸¦ hex·Î »ìÆìº¸¸é ´ÙÀ½°ú °°´Ù.

00000000	05 80 04 08 90 55 aa 90
0x90Àº nop(no operation)À» ÀǹÌÇÑ´Ù.

±×¸®°í 'ld -m elf-i386 -Ttext 0x0 -s --oformat binary test.o -o test.2'ÇÑ °á°ú´Â ´ÙÀ½°ú °°´Ù.

00000000	05 00 00 00 90 55 aa 90

µÑ »çÀÌÀÇ Â÷ÀÌÁ¡Àº -Ttext 0x0°¡ ÀÖ°í ¾ø°íÀÇ Â÷ÀÌ´Ù. ¹ÙÀ̳ʸ® Æ÷¸ËÀÇ °æ¿ì .text¸¦ ÁöÁ¤ÇØ ÁÖÁö ¾ÊÀ¸¸é ½ÃÀÛ ¹øÁö¸¦ ¸¾´ë·Î Á¤Çعö¸®¹Ç·Î .text¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀº test.1¿¡¼­´Â ½ÃÀÛÀÌ 0x09048000À¸·Î ¼³Á¤µÇ¾î ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¾û¶×ÇÑ °÷ÀÇ °ªÀ» »ç¿ëÇϵµ·Ï ¸¸µé±â ¶§¹®¿¡ ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇÒ ¶© Á¦´ë·ÎµÈ ÁÖ¼Ò°¡ µé¾î°¡µµ·Ï .text¸¦ ÇÊ¿äÇÑ °÷À¸·Î ÁöÁ¤ÇØÁÙ Çʿ䰡 ÀÖ´Ù.

¶Ç .textÀÇ ½ÃÀÛÀ» 0x02·Î ÇßÀ» ¶§ÀÇ ¹ÙÀ̳ʸ®´Â ´ÙÀ½°ú °°´Ù.

00000000	90 90 09 00 00 00 90 55 aa 90

À§¿¡¼­ º¸µíÀÌ 0xaa55´Â offsetÀÌ 7ÀÌÁö¸¸ ½ÇÁ¦ ÁöÁ¤µÈ °ÍÀº 9·Î .text°¡ 2ºÎÅÍ ½ÃÀÛÇϱ⠶§¹®ÀÌ´Ù. ¸¸¾à ÀÌ ¹ÙÀ̳ʸ®¸¦ ¸Þ¸ð¸®¿¡ ±×´ë·Î ¿Ã·Á ³õ´Â´Ù¸é Á¦´ë·Î µÈ °ªÀ» ÀÐÁö ¸øÇÒ ¼öµµ ÀÖ´Ù. ÀÌ °æ¿ì¿£ .text°¡ 2¿¡¼­ ½ÃÀÛÇÏ´Â °ÍÀ» ¿°µÎ¿¡ µÎ°í ¸Þ¸ð¸®¿¡ ÀûÀçÇØ¾ß Á¦´ë·Î µ¿ÀÛÇÒ ¼ö ÀÖ´Ù.

½±°Ô Çϱâ À§Çؼ± .text¸¦ 0¿¡¼­ ½ÃÀÛÇÏ°Ô ÇÏ¸é ¹ÙÀ̳ʸ®°¡ ¸Þ¸ð¸®ÀÇ ¾î´À À§Ä¡¿¡ ÀÖ´ø »ó°ü¾øÀÌ Àß µ¿ÀÛÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

2.5.2. ºÐ¼®

2.4Àý¿¡¼­ »ìÆìº» °Í°ú °°Àº °¢ ´Ü°è¸¶´Ù ÀÚ¼¼ÇÑ ³»¿ëÀ» »ìÆì º»´Ù. ÀÌ ÀýÀÌ ³¡³ª¸é ÀÌÁ¦ ¸®´ª½º Ä¿³ÎÀÌ ¾î¶»°Ô ¸¸µé¾îÁö°í ¾î¶² ±¸Á¶¸¦ °®´ÂÁö ¿ÏÀüÈ÷ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

1 ~ 12 ´Ü°è´Â vmlinux¸¦ ¸¸µé±â À§ÇÑ ÇѰèÀ̰í Ä¿³Î ¼³Á¤À» ¾î¶»°Ô Çߴ°¡¿¡ µû¶ó ´Þ¶óÁö¹Ç·Î ¿©±â¼­´Â ´Ù·çÁö ¾Ê´Â´Ù. ¶Ç 17, 18 ´Ü°èµµ bvmlinux¸¦ ¸¸µé±â À§ÇØ ÇÊ¿äÇÑ ´Ü°èÀ̹ǷΠ»ý·«ÇÑ´Ù. ÇÊ¿äÇÑ ³»¿ëÀº 2.4ÀýÀ» ÂüÁ¶Çϰųª °¢ÀÚ log¸¦ ¸¸µé¾î »ìÆìº¸±â ¹Ù¶õ´Ù.

  1. vmlinux

    (1)					
    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
    (2)					
    nm vmlinux | grep -v '\(compiled\)\|\(\.o$\)\|\( [aUw] \)\|\(\.\.ng$\)\|\(LASH[RL]DI\)' | sort > System.map

    (1)
    vmlinux´Â Ä¿³Î ÀÚü¸¦ ÀǹÌÇÑ´Ù. ±×·¡¼­ ¸µÅ©µÇ´Â ¿ÀºêÁ§Æ® µéÀÌ Ä¿³Î ¼³Á¤¿¡¼­ »ç¿ëÇϰڴٰí ÇÑ °Íµé°ú ¼±ÅÃµÈ ¾ÆÅ°ÅØÃÄ¿¡ °ü°èµÈ °ÍµéÀÌ ¹¶ÃÄÁ® ÇϳªÀÇ ÆÄÀÏÀ» ¸¸µé¾î ³½´Ù.

    »ç¿ëµÈ ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.

    • -m elf-i386

      ¾î¶² Æ÷¸ËÀ¸·Î Ãâ·Â¹°À» ¸¸µé °ÍÀÎÁö ÁöÁ¤

    • -T /usr/src/linux-2.4.16/arch/i386/vmlinux.lds

      ¸µÅ·Çϴµ¥ ÇÊ¿äÇÑ ½ºÅ©¸³Æ® ÆÄÀÏÀ» ÁöÁ¤ÇÑ´Ù. ÀÌ ÆÄÀÏ¿¡ ´ëÇÑ ³»¿ëÀº ¾Æ·¡ vmlinux.lds¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

    • -e stext

      ÇÁ·Î±×·¥ÀÇ ½ÃÀÛÁ¡À» ÁöÁ¤ÇÑ´Ù. À§ ½ºÅ©¸³Æ®¿¡ ÁöÁ¤µÈ .stext¸¦ »ç¿ëÇÑ´Ù.

    • --start-group ... --end-group

      ...¿¡ ÁöÁ¤µÈ ¿ÀºêÁ§Æ®¸¦ ¼­·Î°£¿¡ ÂüÁ¶ÇÑ º¯¼ö³ª ÇÔ¼ö°¡ ¿¡·¯³ªÁö ¾ÊÀ» ¶§±îÁö °è¼ÓÇØ¼­ °Ë»öÇÑ´Ù.

    • -o vmlinux

      Ãâ·Â¹°Àº vmlinux·Î ÁöÁ¤

    ¸µÅ©¿¡ »ç¿ëµÈ ½ºÅ©¸³Æ®(vmlinux.lds)´Â ¾Æ·¡¿Í °°´Ù.
    /* ld script to make i386 Linux kernel
     * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
     */
    (1)
    OUTPUT-FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
    OUTPUT-ARCH(i386)
    ENTRY(-start)
    SECTIONS
    {
    (2)
      . = 0xC0000000 + 0x100000;
      -text = .;			/* Text and read-only data */
    (3)
      .text : {
    	*(.text)
    	*(.fixup)
    	*(.gnu.warning)
    	} = 0x9090
      .text.lock : { *(.text.lock) }	/* out-of-line lock text */
    
      -etext = .;			/* End of text section */
    
      .rodata : { *(.rodata) *(.rodata.*) }
      .kstrtab : { *(.kstrtab) }
    
      . = ALIGN(16);		/* Exception table */
      --start---ex-table = .;
      --ex-table : { *(--ex-table) }
      --stop---ex-table = .;
    
      --start---ksymtab = .;	/* Kernel symbol table */
      --ksymtab : { *(--ksymtab) }
      --stop---ksymtab = .;
    
    (4)
      .data : {			/* Data */
    	*(.data)
    	CONSTRUCTORS
    	}
    
      -edata = .;			/* End of data section */
    
    (5)
      . = ALIGN(8192);		/* init-task */
      .data.init-task : { *(.data.init-task) }
    
      . = ALIGN(4096);		/* Init code and data */
      --init-begin = .;
      .text.init : { *(.text.init) }
      .data.init : { *(.data.init) }
      . = ALIGN(16);
      --setup-start = .;
      .setup.init : { *(.setup.init) }
      --setup-end = .;
      --initcall-start = .;
      .initcall.init : { *(.initcall.init) }
      --initcall-end = .;
      . = ALIGN(4096);
      --init-end = .;
    
    (6)
      . = ALIGN(4096);
      .data.page-aligned : { *(.data.idt) }
    
      . = ALIGN(32);
      .data.cacheline-aligned : { *(.data.cacheline-aligned) }
    
      --bss-start = .;		/* BSS */
      .bss : {
    	*(.bss)
    	}
      -end = . ;
    
    (7)
      /* Sections to be discarded */
      /DISCARD/ : {
    	*(.text.exit)
    	*(.data.exit)
    	*(.exitcall.exit)
    	}
    
      /* Stabs debugging sections.  */
      .stab 0 : { *(.stab) }
      .stabstr 0 : { *(.stabstr) }
      .stab.excl 0 : { *(.stab.excl) }
      .stab.exclstr 0 : { *(.stab.exclstr) }
      .stab.index 0 : { *(.stab.index) }
      .stab.indexstr 0 : { *(.stab.indexstr) }
      .comment 0 : { *(.comment) }
    }

    (1)
    vmlinuxÀÇ Æ÷¸Ë°ú ¾ÆÅ°ÅØÃĸ¦ ÁöÁ¤Çϰí ÇÁ·Î±×·¥ ½ÃÀÛÁ¡À» ÁöÁ¤ÇÑ´Ù.
    (2)
    vmlinuxÀÇ ½ÃÀÛ ¹øÁö¸¦ ÁöÁ¤ÇÑ´Ù. 0x100000Àº offsetÀÌ°í ¾ÕÀÇ 0xc0000000Àº gdt³»¿¡ µé¾î°¥ ¶§ ÇÊ¿äÇÑ °ªÀ¸·Î ¹°¸®ÀûÀ¸·Î´Â 0x100000 ¹øÁö¸¦ ÀǹÌÇÑ´Ù.

    ¿©±â¼­ ºÎÅÍ´Â ´Ù¸¥ ºÎºÐ°ú ´Þ¸® gdtµîÀÌ ¼³Á¤µÈ »óÅÂÀÎ ÇÁ·ÎÅØÆ¼µå ¸ðµå¿¡¼­ µ¿ÀÛ ÇϹǷΠ¸Þ¸ð¸® °ü·ÃµÈ °ÍÀ» ½ÇÁ¦ ¾îµå·¹½º¸¦ »ç¿ëÇÏ¸é ¾ÈµÈ´Ù.

    (3)
    Ä¿³Î Äڵ尡 À§Ä¡ÇÒ °÷ÀÌ´Ù. 0x9090Àº ºó°ø°£¿¡ ä¿ö³Ö±â ÇÒ ¶§ 0x9090À» »ç¿ëÇ϶õ ¸»ÀÌ´Ù.
    (4)
    Ưº°È÷ ÁöÁ¤µÇÁö ¾ÊÀº ¸ðµç µ¥ÀÌŸ´Â ¿©±â¿¡ À§Ä¡ÇÑ´Ù. CONSTRUCTOR´Â C++ constructor Á¤º¸¸¦ ¿©±â¿¡ ±â·ÏÇ϶õ ¸»ÀÌ´Ù.
    (5)
    arch/i386/kernel/init-task.c¿¡ ÁöÁ¤µÇ¾îÀÖ°í ÇÁ·Î¼¼½º ½ºÅÃÀ» ´Ù·ç´Â ¹æ½Ä ¶§¹®¿¡ 8192 bytes ´ÜÀ§·Î Á¤·ÄµÇ¾ßÇÑ´Ù.
    (6)
    arch/i386/traps.c¿¡ Á¤ÀǵǾî ÀÖ°í Pentium F0 0F ¹ö±×¸¦ ÇÇÇϱâ À§ÇÑ °£´ÜÇÑ ¹æ¹ýÀ¸·Î ÆäÀÌÁö Á¤·ÄÀ» »ç¿ëÇÑ´Ù(ÆäÀÌÁö´Â 4096 bytes¸¦ ÀǹÌÇÑ´Ù).
    (7)
    ¹«½ÃµÇ°í »ç¿ëµÇÁö ¾Ê´Â ¼½¼ÇÀ¸·Î vmlinux¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. Ä¿³ÎÀÌ exitÇÒ ÀÏÀº ¾ø±â ¶§¹®ÀÌ´Ù.

    (2)
    nmÀº ¿ÀºêÁ§Æ® ÆÄÀÏ¿¡¼­ ½Éº¼À» ÃßÁÙÇØ ÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. Ä¿³Î À̹ÌÁö ÆÄÀÏ¿¡¼­ ¸ðµç ½Éº¼À» ÃßÃâÇØ³»°í ÀÌ Áß¿¡ ÇÊ¿äÇÑ ºÎºÐ¸¸À» Ãß·Á System.mapÀ» ¸¸µç´Ù. grep¿¡ »ç¿ëµÈ -v´Â µÚ¿¡ ³ª¿À´Â °æ¿ì¸¦ Á¦¿ÜÇÑ °Í µéÀ» ã¾ÆÁØ´Ù. Ä¿³Î ÄÄÆÄÀÏÀÌ ³¡³­ ÈÄ 'nm vmlinux > test.map'¸¸ ÇÑ °á°ú¿Í System.mapÀ» ºñ±³ÇØ º¸¸é grep¿¡¼­ ã´Â °ÍµéÀÌ ¾î¶² °ÍÀÎÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

    System.mapÀº óÀ½ ºÎÆÃ ¶§ ¸Þ¸ð¸®¿¡ ÀÐÇô ¿Ã·ÁÁö°í µå¶óÀ̹öµîÀÌ Ä¿³Î ½Éº¼À» ãÀ» ¶§ »ç¿ëÇÑ´Ù.

  2. bbootsect

    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
    ld -m elf-i386 -Ttext 0x0 -s --oformat binary bbootsect.o -o bbootsect
    bbootsect.s´Â bootsect.S¸¦ ÄÄÆÄÀÏÇØ ¸¸µéµÇ --BIG-KERNEL--À» Á¤ÀÇÇØ ¸¸µç´Ù. bootsect.S¸¦ »ìÆìº¸¸é ÀÌ¿Í °ü·ÃµÈ °÷ÀÌ ÇÑ ±ºµ¥ ÀÖ´Â °ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù.

    ld¿¡ »ç¿ëµÈ ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.

    • -m elf-i386

      elf-i386¸¦ ¿¡¹Ä·¹À̼Ç

    • -Ttext 0x0

      text ¼¼±×¸ÕÆ®ÀÇ ½ÃÀÛÀ» 0x0À¸·Î ÁöÁ¤

    • -s

      ¸ðµç µð¹ö±ë Á¤º¸¸¦ ¾ø¾Ø´Ù

    • -oformat binary

      bbootsectÀÇ Æ÷¸ËÀº ¹ÙÀ̳ʸ®

  3. 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
    ld -m elf-i386 -Ttext 0x0 -s --oformat binary -e begtext -o bsetup bsetup.o
    bbootsect¿Í °°Àº ¹æ¹ýÀ» ¸¸µç´Ù.

  4. arch/i386/boot/compressed/piggy.o

    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
    piggy.o´Â $(TOPDIR)/vmlinux¸¦ ¾ÐÃàÇØ ¸¸µç´Ù. ¿ì¼± vmlinux¿¡¼­ ½Éº¼°ú ÇÊ¿ä ¾ø´Â ¼½¼ÇÀ» ¾ø¾Ö°í ¹ÙÀ̳ʸ® ÇüÅ·Π¸¸µç´ÙÀ½ gzipÀ» ÀÌ¿ëÇØ ¾ÐÃàÇÑ´Ù. ¾ÐÃàµÈ °ÍÀ» ´Ù½Ã elf-i386 ÇüÅ·Π¸¸µé¾î ³õ´Â´Ù.

    ld¿¡ »ç¿ëµÈ ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.

    • -m elf-i386

      elf-i386¸¦ ¸Þ¹Ä·¹À̼Ç

    • -b binary $tmppiggy.gz

      $tmppiggy.gzÀº ¹ÙÀ̳ʸ® Çü½Ä

    • -b elf32-i386

      piggy.o´Â elf32-i386 Çü½Ä

    • -T $tmppiggy.lnk

      $tmppiggy.lnk¸¦ »ç¿ëÇØ ¸µÅ©ÇÑ´Ù.

    $tmppiggy.lnkÀÇ ³»¿ëÀº ´ÙÀ½°ú °°´Ù.

    SECTIONS
    {
    	.data : {
    		input-len = .;
    		LONG(input-data-end - input-data)
    		input-data = .;
    		*(.data)
    		input-data-end = .;
    		}
    }

    ¾ÐÃàµÈ vmlinux´Â .data¿¡ µé¾î°¡°Ô µÇ°í *(.data)·Î Ç¥½ÃµÈ °÷¿¡ µé¾î°¡°Ô µÈ´Ù. ±× ÀüÈÄ¿¡ LONG(input-data-end - input-data)·Î ¾ÐÃàµÈ Ä¿³ÎÀÇ Å©±â¸¦ ÀúÀåÇÑ´Ù.

  5. arch/i386/boot/compressed/bvmlinux

    ld -m elf-i386 -Ttext 0x100000 -e startup-32 -o bvmlinux head.o misc.o piggy.o

    bvmlinux´Â ¾ÐÃàµÈ Ä¿³Î°ú head.o, misc.o¸¦ ÇÕÃÄ ¸¸µç´Ù. head.o´Â ¸Þ¸ð¸® ¼¼ÆÃÀ̶ó°í º¸¸éµÇ°í misc.o´Â ¾ÐÃàÀ» Ç®±â À§ÇÑ Äڵ尡 µé¾îÀÖ´Ù. ld¿¡ »ç¿ëµÈ ¿É¼ÇÀº $(TOPDIR)/vmlinux¸¦ ¸¸µé ¶§¿Í °ÅÀÇ Èí»çÇÏ´Ù. ´Ü textÀÇ ½ÃÀÛ ¹øÁö´Â 0x100000ÀÌ´Ù.

    ºÎÆÃÇÒ ¶§ bvmlinux´Â ¹Ýµå½Ã 0x100000¿¡ ¿Ã·ÁÁ®¼­ ½ÇÇàµÇ¾ßÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.

    ¾ÐÃàµÈ Ä¿³ÎÀÇ Å©±â¸¦ piggy.o¿¡ ÀúÀåÇØ ³õ¾Ò±â ¶§¹®¿¡ ¸Þ¸ð¸®ÀÇ ¾î´À À§Ä¡¿¡¼­ piggy.o°¡ ³¡³ª´ÂÁö ¾Ë¼ö ÀÖ´Ù. À̵ڿ¡ ¾ÐÃàÀ» Ç®¾î ³õ°í ¾ÐÃàÀÌ Ç®¸° Ä¿³ÎÀ» ´Ù½Ã 0x100000À¸·Î ¿Å°Ü¿Í ½ÇÇàÇÑ´Ù.

  6. build

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

    build´Â 2.3.5Àý¿¡¼­¿Í °°ÀÌ µ¿ÀÛÇϵµ·Ï ¸¸µé¾îÁø´Ù.

  7. bvmlinux.out

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

    bvmlinux¿¡¼­ ÇÊ¿ä ¾ø´Â °ÍÀ» Á¦¿ÜÇÏ°í ¹ÙÀ̳ʸ®·Î ¸¸µç´Ù.

  8. 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

    build¸¦ »ç¿ëÇØ bzImage¸¦ ¸¸µç´Ù. ÁöÁ¤µÈ ·çÆ® µð¹ÙÀ̽º, ºÎÆ®¼½ÅÍ Å©±â, setupÀÇ Å©±â ±×¸®°í Ä¿³ÎÀÇ Å©±â¸¦ Ç¥½ÃÇØ ÁØ´Ù. buildÀÇ µ¿ÀÛÀº 2.3.5ÀýÀ» ÂüÁ¶ ¹Ù¶õ´Ù.