summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2015-03-25 23:29:29 -0700
committeriximeow <me@iximeow.net>2015-09-28 03:36:16 -0700
commit93136af1a590a786cf6418bfea1b74d06830f211 (patch)
tree1fbbbd80c5f01a18518a0d118e6b83c923aadc37
parentfe8a45a19edcd6693b47cb7f034d400f0610332f (diff)
.project and helpers
-rw-r--r--.project15
-rwxr-xr-xbuild13
-rwxr-xr-xbuild/bootloader.sh3
-rwxr-xr-xbuild/compile.sh9
-rwxr-xr-xbuild/splicetobootsect.sh18
-rwxr-xr-xbuild_helpers/bootloader.sh5
-rwxr-xr-xbuild_helpers/compile.sh16
-rwxr-xr-xbuild_helpers/splicetobootsect.sh31
-rwxr-xr-xrun3
9 files changed, 83 insertions, 30 deletions
diff --git a/.project b/.project
new file mode 100644
index 0000000..4f8d223
--- /dev/null
+++ b/.project
@@ -0,0 +1,15 @@
+project_name="ixos"
+
+run() {
+ $(grt)/build
+ if [ $? -ne 0 ]; then
+ echo "[-] Build failed!"
+ else
+ $(grt)/run
+ fi
+}
+
+build() {
+ $(grt)/build
+}
+project_name="ixos"
diff --git a/build b/build
new file mode 100755
index 0000000..8ce32ef
--- /dev/null
+++ b/build
@@ -0,0 +1,13 @@
+#! /bin/bash
+set -u
+set -e
+
+sources=$(find src -type f)
+for source in $sources; do
+ build_helpers/compile.sh "$source"
+done
+
+build_helpers/bootloader.sh
+build_helpers/splicetobootsect.sh bin/bootloader.bin
+
+echo "[+] Done!"
diff --git a/build/bootloader.sh b/build/bootloader.sh
deleted file mode 100755
index b56bb3d..0000000
--- a/build/bootloader.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#! /bin/sh
-FILENAME="bootloader"
-nasm "$FILENAME".asm -f bin -o "$FILENAME".bin
diff --git a/build/compile.sh b/build/compile.sh
deleted file mode 100755
index da75dec..0000000
--- a/build/compile.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#! /bin/sh
-INPATH=$1
-INFILE=$(basename $1)
-INFILENAME="${INFILE%.*}"
-INEXT="${INFILE##*.}"
-gcc -T linker.ld -m32 -nostartfiles -nostdlib -ffreestanding "$INPATH" -o "tmp/$INFILENAME".o
-objcopy -S -R .note.gnu.build-id -R .comment -O binary "tmp/$INFILENAME".o "bin/$INFILENAME".bin
-rm "tmp/$INFILENAME".o
-
diff --git a/build/splicetobootsect.sh b/build/splicetobootsect.sh
deleted file mode 100755
index 7418c9b..0000000
--- a/build/splicetobootsect.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#! /bin/bash
-if [[ $1 == "" ]]; then
- echo "Argument must be the path to a binary to splice into a bootsector"
- exit 1
-fi
-
-INSIZE=$(stat -c%s $1)
-if [ $INSIZE -ge 510 ]; then
- echo "Input file is greater than bootsector max size: 510 bytes."
- exit 1
-fi
-
-OUTFILE="$(basename $1)_with_bootsect.bin"
-echo "Initializing output file"
-dd if=bin/dummy.bin of="$OUTFILE" >/dev/null 2>&1
-echo "Splicing binary"
-dd if="$1" of="$OUTFILE" conv=notrunc >/dev/null 2>&1
-echo "Done. Generated file: $OUTFILE"
diff --git a/build_helpers/bootloader.sh b/build_helpers/bootloader.sh
new file mode 100755
index 0000000..267ba91
--- /dev/null
+++ b/build_helpers/bootloader.sh
@@ -0,0 +1,5 @@
+#! /bin/sh
+set -e
+set -u
+FILENAME="bootloader"
+nasm "$FILENAME".asm -f bin -o "bin/$FILENAME".bin
diff --git a/build_helpers/compile.sh b/build_helpers/compile.sh
new file mode 100755
index 0000000..8f4f376
--- /dev/null
+++ b/build_helpers/compile.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+set -u
+set -e
+
+INPATH="$1"
+INBASEPATH="${INPATH%.*}"
+# mangle such that no two names conflict (a/b/c and a/b.c conflicting would be no fun)
+OUTNAME="$(echo "$INBASEPATH" | sed 's/\./../g' | sed 's/\//._/g')"
+echo -n "[*] Building '$INPATH' to 'tmp/$OUTNAME'... "
+gcc -T linker.ld -m32 -nostartfiles -nostdlib -ffreestanding "$INPATH" -o "tmp/$OUTNAME".o
+echo " OK!"
+echo -n "[+] Stripping unnecessary sections... "
+objcopy -R .note.gnu.build-id -R .comment -O binary "tmp/$OUTNAME".o "bin/$OUTNAME".bin
+echo " OK!"
+rm "tmp/$OUTNAME".o
+
diff --git a/build_helpers/splicetobootsect.sh b/build_helpers/splicetobootsect.sh
new file mode 100755
index 0000000..ac4ca0d
--- /dev/null
+++ b/build_helpers/splicetobootsect.sh
@@ -0,0 +1,31 @@
+#! /bin/bash
+set -u
+set -e
+
+if [ -z "$1" ] || [ ! -f "$1" ]; then
+ echo "Argument must be the path to a binary to splice into a bootsector"
+ exit 1
+fi
+
+INSIZE=$(stat -c%s $1)
+if [ $INSIZE -ge 510 ]; then
+ echo "Input file is greater than bootsector max size (510 bytes)"
+ exit 1
+fi
+
+OUTFILE="bootable.img"
+echo -n "[*] Creating bootsector template... "
+dd if=/dev/zero bs=510 count=1 of="$OUTFILE" >/dev/null 2>&1
+echo -ne "\x55\xaa" >> "$OUTFILE"
+dd if=/dev/zero bs=512 count=255 ibs=512 seek=1 of="$OUTFILE" >/dev/null 2>&1
+echo " OK!"
+
+echo -n "[*] Inserting bootsector... "
+dd if="$1" of="$OUTFILE" conv=notrunc >/dev/null 2>&1
+echo " OK!"
+
+echo -n "[*] Inserting kernel... "
+dd if="bin/src._kernel._main.bin" of="$OUTFILE" conv=notrunc ibs=512 seek=1 >/dev/null 2>&1
+echo " OK!"
+echo "Done. File at:"
+echo "$OUTFILE"
diff --git a/run b/run
new file mode 100755
index 0000000..779d0a3
--- /dev/null
+++ b/run
@@ -0,0 +1,3 @@
+#! /bin/bash
+
+qemu-system-x86_64 bootable.img