diff options
| -rw-r--r-- | mk.conf | 10 | ||||
| -rw-r--r-- | mk/linux/b.sh | 4 | ||||
| -rw-r--r-- | mk/netbsd/b.sh | 4 | ||||
| -rw-r--r-- | src/linux-start.o | bin | 0 -> 776 bytes | |||
| -rw-r--r-- | src/linux-start.s | 16 | ||||
| -rw-r--r-- | src/netbsd-start.s (renamed from src/start.s) | 3 |
6 files changed, 27 insertions, 10 deletions
| diff --git a/mk.conf b/mk.conf index c520246..30feef6 100644 --- a/mk.conf +++ b/mk.conf | |||
| @@ -6,16 +6,18 @@ bin_ln="bin" | |||
| 6 | 6 | ||
| 7 | netbsd_note_src="$src/netbsd-note.s" | 7 | netbsd_note_src="$src/netbsd-note.s" |
| 8 | netbsd_note_bin="$out/netbsd-note.o" | 8 | netbsd_note_bin="$out/netbsd-note.o" |
| 9 | start_src="$src/start.s" | 9 | netbsd_start_src="$src/netbsd-start.s" |
| 10 | start_bin="$out/start.o" | 10 | netbsd_start_bin="$out/netbsd-start.o" |
| 11 | linux_start_src="$src/linux-start.s" | ||
| 12 | linux_start_bin="$src/linux-start.o" | ||
| 11 | main_src="$src/main.c" | 13 | main_src="$src/main.c" |
| 12 | main_bin="$out/main.o" | 14 | main_bin="$out/main.o" |
| 13 | 15 | ||
| 14 | ln="ln" | 16 | ln="ln" |
| 15 | as="as" | 17 | as="as" |
| 16 | ld="ld" | 18 | ld="ld" |
| 17 | ld_netbsd_cfg="netbsd-cfg.ld" | 19 | netbsd_ld_cfg="netbsd-cfg.ld" |
| 18 | ld_linux_cfg="linux-cfg.ld" | 20 | linux_ld_cfg="linux-cfg.ld" |
| 19 | cc="gcc" | 21 | cc="gcc" |
| 20 | 22 | ||
| 21 | lnflgs="-sf" | 23 | lnflgs="-sf" |
| diff --git a/mk/linux/b.sh b/mk/linux/b.sh index c9b9b04..db5c30f 100644 --- a/mk/linux/b.sh +++ b/mk/linux/b.sh | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | set -e | 2 | set -e |
| 3 | 3 | ||
| 4 | mkdir $out | 4 | mkdir $out |
| 5 | $as $asflgs -o $start_bin $start_src | 5 | $as $asflgs -o $linux_start_bin $linux_start_src |
| 6 | $cc $ccflgs -o $main_bin -c $main_src | 6 | $cc $ccflgs -o $main_bin -c $main_src |
| 7 | $ld $ldflgs -T $ld_linux_cfg -o $bin $start_bin $main_bin | 7 | $ld $ldflgs -T $linux_ld_cfg -o $bin $linux_start_bin $main_bin |
| 8 | $ln $lnflgs $bin $bin_ln | 8 | $ln $lnflgs $bin $bin_ln |
| diff --git a/mk/netbsd/b.sh b/mk/netbsd/b.sh index 6a4251c..f27512a 100644 --- a/mk/netbsd/b.sh +++ b/mk/netbsd/b.sh | |||
| @@ -3,7 +3,7 @@ set -e | |||
| 3 | 3 | ||
| 4 | mkdir $out | 4 | mkdir $out |
| 5 | $as $asflgs -o $netbsd_note_bin $netbsd_note_src | 5 | $as $asflgs -o $netbsd_note_bin $netbsd_note_src |
| 6 | $as $asflgs -o $start_bin $start_src | 6 | $as $asflgs -o $netbsd_start_bin $netbsd_start_src |
| 7 | $cc $ccflgs -o $main_bin -c $main_src | 7 | $cc $ccflgs -o $main_bin -c $main_src |
| 8 | $ld $ldflgs -T $ld_netbsd_cfg -o $bin $netbsd_note_bin $start_bin $main_bin | 8 | $ld $ldflgs -T $netbsd_ld_cfg -o $bin $netbsd_note_bin $netbsd_start_bin $main_bin |
| 9 | $ln $lnflgs $bin $bin_ln | 9 | $ln $lnflgs $bin $bin_ln |
| diff --git a/src/linux-start.o b/src/linux-start.o new file mode 100644 index 0000000..72750c8 --- /dev/null +++ b/src/linux-start.o | |||
| Binary files differ | |||
| diff --git a/src/linux-start.s b/src/linux-start.s new file mode 100644 index 0000000..6392e45 --- /dev/null +++ b/src/linux-start.s | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | .section .text | ||
| 2 | .globl _start | ||
| 3 | .type _start, @function | ||
| 4 | _start: | ||
| 5 | xorq %rbp, %rbp # frame ptr (%rbp) = null. marks stack bottom. | ||
| 6 | |||
| 7 | movq (%rsp), %rdi # argc = first 4 bytes of stack. | ||
| 8 | leaq 8(%rsp), %rsi # argv = address of first arg ptr. | ||
| 9 | |||
| 10 | call main | ||
| 11 | |||
| 12 | movl %eax, %edi # status = ret val. | ||
| 13 | movl $60, %eax # SYS_exit = 60. | ||
| 14 | syscall | ||
| 15 | |||
| 16 | hlt # if syscall fails hang. | ||
| diff --git a/src/start.s b/src/netbsd-start.s index 683bfe7..e4e960e 100644 --- a/src/start.s +++ b/src/netbsd-start.s | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | _start: | 4 | _start: |
| 5 | xorq %rbp, %rbp # frame ptr (%rbp) = null. marks stack bottom. | 5 | xorq %rbp, %rbp # frame ptr (%rbp) = null. marks stack bottom. |
| 6 | 6 | ||
| 7 | movl (%rsp), %edi # argc = first 4 bytes of stack. | 7 | movq (%rsp), %rdi # argc = first 4 bytes of stack. |
| 8 | leaq 8(%rsp), %rsi # argv = address of first arg ptr. | 8 | leaq 8(%rsp), %rsi # argv = address of first arg ptr. |
| 9 | 9 | ||
| 10 | call main | 10 | call main |
| @@ -13,5 +13,4 @@ _start: | |||
| 13 | movl $1, %eax # SYS_exit = 1. | 13 | movl $1, %eax # SYS_exit = 1. |
| 14 | syscall | 14 | syscall |
| 15 | 15 | ||
| 16 | .size _start, .-_start | ||
| 17 | hlt # if syscall fails hang. | 16 | hlt # if syscall fails hang. |
