¿©±â¼ -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 |
±×¸®°í '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.4Àý¿¡¼ »ìÆìº» °Í°ú °°Àº °¢ ´Ü°è¸¶´Ù ÀÚ¼¼ÇÑ ³»¿ëÀ» »ìÆì º»´Ù. ÀÌ ÀýÀÌ ³¡³ª¸é ÀÌÁ¦ ¸®´ª½º Ä¿³ÎÀÌ ¾î¶»°Ô ¸¸µé¾îÁö°í ¾î¶² ±¸Á¶¸¦ °®´ÂÁö ¿ÏÀüÈ÷ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
1 ~ 12 ´Ü°è´Â vmlinux¸¦ ¸¸µé±â À§ÇÑ ÇѰèÀ̰í Ä¿³Î ¼³Á¤À» ¾î¶»°Ô Çߴ°¡¿¡ µû¶ó ´Þ¶óÁö¹Ç·Î ¿©±â¼´Â ´Ù·çÁö ¾Ê´Â´Ù. ¶Ç 17, 18 ´Ü°èµµ bvmlinux¸¦ ¸¸µé±â À§ÇØ ÇÊ¿äÇÑ ´Ü°èÀ̹ǷΠ»ý·«ÇÑ´Ù. ÇÊ¿äÇÑ ³»¿ëÀº 2.4ÀýÀ» ÂüÁ¶Çϰųª °¢ÀÚ log¸¦ ¸¸µé¾î »ìÆìº¸±â ¹Ù¶õ´Ù.
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 |
»ç¿ëµÈ ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.
-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) } } |
¿©±â¼ ºÎÅÍ´Â ´Ù¸¥ ºÎºÐ°ú ´Þ¸® gdtµîÀÌ ¼³Á¤µÈ »óÅÂÀÎ ÇÁ·ÎÅØÆ¼µå ¸ðµå¿¡¼ µ¿ÀÛ ÇϹǷΠ¸Þ¸ð¸® °ü·ÃµÈ °ÍÀ» ½ÇÁ¦ ¾îµå·¹½º¸¦ »ç¿ëÇÏ¸é ¾ÈµÈ´Ù.
System.mapÀº óÀ½ ºÎÆÃ ¶§ ¸Þ¸ð¸®¿¡ ÀÐÇô ¿Ã·ÁÁö°í µå¶óÀ̹öµîÀÌ Ä¿³Î ½Éº¼À» ãÀ» ¶§ »ç¿ëÇÑ´Ù.
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 |
ld¿¡ »ç¿ëµÈ ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.
-m elf-i386
elf-i386¸¦ ¿¡¹Ä·¹À̼Ç
-Ttext 0x0
text ¼¼±×¸ÕÆ®ÀÇ ½ÃÀÛÀ» 0x0À¸·Î ÁöÁ¤
-s
¸ðµç µð¹ö±ë Á¤º¸¸¦ ¾ø¾Ø´Ù
-oformat binary
bbootsectÀÇ Æ÷¸ËÀº ¹ÙÀ̳ʸ®
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 |
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 |
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)·Î ¾ÐÃàµÈ Ä¿³ÎÀÇ Å©±â¸¦ ÀúÀåÇÑ´Ù.
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À¸·Î ¿Å°Ü¿Í ½ÇÇàÇÑ´Ù.
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Àý¿¡¼¿Í °°ÀÌ µ¿ÀÛÇϵµ·Ï ¸¸µé¾îÁø´Ù.
bvmlinux.out
objcopy -O binary -R .note -R .comment -S compressed/bvmlinux compressed/bvmlinux.out |
bvmlinux¿¡¼ ÇÊ¿ä ¾ø´Â °ÍÀ» Á¦¿ÜÇÏ°í ¹ÙÀ̳ʸ®·Î ¸¸µç´Ù.
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ÀýÀ» ÂüÁ¶ ¹Ù¶õ´Ù.