Оглавление
§ Компиляция GCC (32 бит)
Здесь я привел типичный файл для разработки собственного ядра ОС.
CC=gcc
COPT=-Os -ffreestanding -fno-pie -nostdlib -m32 -mno-sse
DEPS=nasm.o main.o
all: boot.bin $(DEPS)
ld -m elf_i386 -nostdlib -nodefaultlibs --oformat binary -Ttext=0x8000 -Tdata=0x100000 $(DEPS) -o disk/main.bin
nasm.o: main.asm
nasm -felf32 -o nasm.o main.asm
main.o: main.h ata.h pic.h main.c
$(CC) $(COPT) -c main.c -o main.o
boot.bin: boot.asm
fasm boot.asm
dd conv=notrunc if=boot.bin of=floppy.img bs=512 count=1
bochs:
bochs -f a.bxrc -q
disk:
dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=/dev/zero of=disk.img bs=1024 count=262144
mkdir disk
mkfs:
losetup -o 0 /dev/loop1 floppy.img
mkfs.fat -F12 /dev/loop1
losetup -d /dev/loop1
mnt:
mount floppy.img -t vfat -o loop,rw,uid="`whoami`",sync,offset=0 disk
clean:
rm -f *.o *.ini boot.bin
§ Компиляция Borland CPP (16 бит)
Я очень давно искал инструмент, с помощью которого можно было бы откомплировать файл Си в мышиный код. Это произошло спустя несколько сотен лет. Итак:
all:
bcc -O -0 main.c -Md -c main.o
ld86 main.o -o main.out
objdump86 main.out > main.txt
php out2bin.php main.txt MAIN.COM
rm *.o *.out *.txt
Компилирует файл main.c в особый код. Ниже приведен файл main.c:
int main() {
unsigned char* m = (unsigned char*) 0xA000;
int i;
for (i = 0; i < 4096; i++) m[i] = i;
return 0;
}
Что получается по итогу при вызове функции objdump86 test:
OBJECTFILE 'test'
HLEN 32
CPU i386 LITTLE_ENDIAN
FLAGS: A_EXEC
a_total = 0x00008038
a_syms = 0x00000020
text data bss dec hex filename
56 0 0 56 38 test
SYMBOLS
00000000 T _main
00000000 a main.off
TEXTSEG
: 55 89 e5 57 56 4c 4c c7 46 fa 00 a0 4c 4c 31 c0 U..WVLL.F...LL1.
: 89 46 f8 eb 10 8b 46 f8 03 46 fa 89 c3 8a 46 f8 .F....F..F....F.
: 88 07 ff 46 f8 81 7e f8 00 10 7c e9 31 c0 83 c4 ...F..~...|.1...
: 04 5e 5f 5d c3 00 00 00 .^_]....
DATASEG
Отсюда можно извлечь с помощью каких-нибудь скриптов необходимую последовательность байт и записать в виде COM-файла для запуска.
§ Код скрипта
Для извлечения бинарного кода.
<?php
$b = '';
foreach (file($argv[1]) as $m) {
$x = "([0-9a-f]{2})";
if (preg_match("~:\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s+$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x~", $m, $c)) {
for ($i = 1; $i <= 16; $i++) $b .= chr(hexdec($c[$i]));
} else if (preg_match("~:\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x~", $m, $c)) {
for ($i = 1; $i <= 8; $i++) $b .= chr(hexdec($c[$i]));
}
}
file_put_contents($argv[2], $b);