:: commit 5663169aa662aab7c15a22b584119b266f507d92

mintsuki <mintsuki@protonmail.com> — 2020-09-13 12:36

parents: 859a10b142

Switch back to GCC

diff --git a/.gitignore b/.gitignore
index ea292fbf..4a6d47c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,5 @@
 /**/*.o
 /**/*.a
-/**/*.bc
 /**/*.bin
 /**/*.bin.gz
 /**/*.elf
diff --git a/Makefile b/Makefile
index 52cbfe3e..353fd3a8 100644
--- a/Makefile
+++ b/Makefile
@@ -2,8 +2,8 @@ DESTDIR =
 PREFIX = /usr/local
 
 OS := $(shell uname)
-CC = clang
-OBJCOPY = llvm-objcopy
+CC = cc
+OBJCOPY = objcopy
 CFLAGS = -O2 -pipe -Wall -Wextra
 
 .PHONY: all install clean echfs-test ext2-test test.img
@@ -21,12 +21,8 @@ src/limine.bin:
 	$(MAKE) -C src all
 
 limine-install: src/limine.bin limine-install.c
-	$(CC) $(CFLAGS) -c limine-install.c -o limine-install.o
-	# FIXME: GNU objcopy supports `-O default` but for some stupid reason
-	#        llvm-objcopy does not. This needs to be worked around.
-	#        For now hardcode elf64-x86-64.
-	$(OBJCOPY) -I binary -O elf64-x86-64 src/limine.bin limine.o
-	$(CC) $(CFLAGS) limine.o limine-install.o -o limine-install
+	$(OBJCOPY) -I binary -O default src/limine.bin limine.o
+	$(CC) $(CFLAGS) limine.o limine-install.c -o limine-install
 
 test.img:
 	rm -f test.img
diff --git a/src/Makefile b/src/Makefile
index 2a10aaf7..efba6e88 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,11 +1,13 @@
-OPT_LEVEL = z
-CFLAGS = -pipe -Wall -Wextra
+CC = ../toolchain/bin/i386-elf-gcc
+LD = ../toolchain/bin/i386-elf-gcc
 
-INTERNAL_CFLAGS = \
-	-O$(OPT_LEVEL) \
+CFLAGS = -flto -Os -pipe -Wall -Wextra
+
+INTERNAL_CFLAGS =  \
 	-std=gnu99 \
 	-ffreestanding \
-	-flto \
+	-fno-stack-protector \
+	-fno-pic \
 	-mno-80387 \
 	-mno-mmx \
 	-mno-sse \
@@ -13,37 +15,37 @@ INTERNAL_CFLAGS = \
 	-I. \
 	-Wno-address-of-packed-member
 
+LDFLAGS = -flto -Os
+
 INTERNAL_LDFLAGS = \
-	-static \
+	-lgcc \
+	-static-libgcc \
 	-nostdlib \
-	-Tlinker.ld \
-	-no-pie
+	-no-pie \
+	-static \
+	-Tlinker.ld
 
 .PHONY: all clean
 
 C_FILES := $(shell find ./ -type f -name '*.c' | grep -v bootsect | grep -v decompressor | sort)
 ASM_FILES := $(shell find ./ -type f -name '*.asm' | grep -v bootsect | grep -v decompressor | sort)
-ASM_OBJ := $(ASM_FILES:.asm=.o)
-BC := $(C_FILES:.c=.bc)
+OBJ := $(ASM_FILES:.asm=.o) $(C_FILES:.c=.o)
 
 all: limine.bin
 
-limine.bin: $(BC) $(ASM_OBJ)
-	llvm-link $(BC) -o bundle.bc
-	opt --O$(OPT_LEVEL) bundle.bc -o optimised_bundle.bc
-	clang --target=i386-elf -O$(OPT_LEVEL) -c optimised_bundle.bc -o optimised_bundle.o
-	ld.lld optimised_bundle.o $(ASM_OBJ) $(INTERNAL_LDFLAGS) -o stage2.elf
-	llvm-objcopy -O binary stage2.elf stage2.bin
+limine.bin: $(OBJ)
+	$(LD) $(OBJ) $(LDFLAGS) $(INTERNAL_LDFLAGS) -o stage2.elf
+	objcopy -O binary stage2.elf stage2.bin
 	gzip -9 < stage2.bin > stage2.bin.gz
 	$(MAKE) -C decompressor
 	cd bootsect && nasm bootsect.asm -fbin -o ../limine.bin
 
-%.bc: %.c
-	clang --target=i386-elf $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
+%.o: %.c
+	$(CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
 
 %.o: %.asm
 	nasm $< -f elf32 -o $@
 
 clean:
 	$(MAKE) -C decompressor clean
-	rm -f stage2.bin.gz limine.bin $(ASM_OBJ) $(BC)
+	rm -f stage2.bin.gz stage2.bin stage2.elf limine.bin $(OBJ)
diff --git a/src/decompressor/Makefile b/src/decompressor/Makefile
index 4a774b94..f5f0f3a4 100644
--- a/src/decompressor/Makefile
+++ b/src/decompressor/Makefile
@@ -1,11 +1,13 @@
-OPT_LEVEL = z
-CFLAGS = -pipe -Wall -Wextra
+CC = ../../toolchain/bin/i386-elf-gcc
+LD = ../../toolchain/bin/i386-elf-gcc
 
-INTERNAL_CFLAGS = \
-	-O$(OPT_LEVEL) \
+CFLAGS = -flto -Os -pipe -Wall -Wextra
+
+INTERNAL_CFLAGS =  \
 	-std=gnu99 \
 	-ffreestanding \
-	-flto \
+	-fno-stack-protector \
+	-fno-pic \
 	-mno-80387 \
 	-mno-mmx \
 	-mno-sse \
@@ -13,28 +15,29 @@ INTERNAL_CFLAGS = \
 	-I. \
 	-Wno-address-of-packed-member
 
+LDFLAGS = -flto -Os
+
 INTERNAL_LDFLAGS = \
-	-static \
+	-lgcc \
+	-static-libgcc \
 	-nostdlib \
-	-Tlinker.ld \
-	-no-pie
+	-no-pie \
+	-static \
+	-Tlinker.ld
 
 .PHONY: all clean
 
 C_FILES := $(shell find ./ -type f -name '*.c' | sort)
-BC := $(C_FILES:.c=.bc)
+OBJ := $(C_FILES:.c=.o)
 
 all: decompressor.bin
 
-decompressor.bin: $(BC)
-	llvm-link $(BC) -o bundle.bc
-	opt --O$(OPT_LEVEL) bundle.bc -o optimised_bundle.bc
-	clang --target=i386-elf -O$(OPT_LEVEL) -c optimised_bundle.bc -o optimised_bundle.o
-	ld.lld optimised_bundle.o $(INTERNAL_LDFLAGS) -o decompressor.elf
-	llvm-objcopy -O binary decompressor.elf decompressor.bin
+decompressor.bin: $(OBJ)
+	$(LD) $(OBJ) $(LDFLAGS) $(INTERNAL_LDFLAGS) -o decompressor.elf
+	objcopy -O binary decompressor.elf decompressor.bin
 
-%.bc: %.c
-	clang --target=i386-elf $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
+%.o: %.c
+	$(CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
 
 clean:
-	rm -f decompressor.bin $(BC)
+	rm -f decompressor.bin decompressor.elf $(OBJ)
diff --git a/src/main.c b/src/main.c
index 08ee961f..e8e75e0a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -12,8 +12,7 @@ ASM_BASIC(
     "sub ecx, OFFSET bss_begin\n\t"
     "rep stosb\n\t"
 
-    "mov ebx, OFFSET main\n\t"
-    "jmp ebx\n\t"
+    "jmp main\n\t"
 );
 
 #include <limine.h>
diff --git a/toolchain/.gitignore b/toolchain/.gitignore
new file mode 100644
index 00000000..fd038def
--- /dev/null
+++ b/toolchain/.gitignore
@@ -0,0 +1,3 @@
+*
+!.gitignore
+!make_toolchain.sh
diff --git a/toolchain/make_toolchain.sh b/toolchain/make_toolchain.sh
new file mode 100755
index 00000000..00eb5230
--- /dev/null
+++ b/toolchain/make_toolchain.sh
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+
+set -e
+set -x
+
+PREFIX="$(pwd)"
+TARGET=i386-elf
+BINUTILSVERSION=2.35
+GCCVERSION=10.2.0
+
+if [ -z "$MAKEFLAGS" ]; then
+	MAKEFLAGS="$1"
+fi
+export MAKEFLAGS
+
+export PATH="$PREFIX/bin:$PATH"
+
+if [ -x "$(command -v gmake)" ]; then
+    mkdir -p "$PREFIX/bin"
+    cat <<EOF >"$PREFIX/bin/make"
+#!/usr/bin/env sh
+gmake "\$@"
+EOF
+    chmod +x "$PREFIX/bin/make"
+fi
+
+mkdir -p build
+cd build
+
+if [ ! -f binutils-$BINUTILSVERSION.tar.gz ]; then
+    wget -4 https://ftp.gnu.org/gnu/binutils/binutils-$BINUTILSVERSION.tar.gz # Force IPv4 otherwise wget hangs
+fi
+if [ ! -f gcc-$GCCVERSION.tar.gz ]; then
+    wget -4 https://ftp.gnu.org/gnu/gcc/gcc-$GCCVERSION/gcc-$GCCVERSION.tar.gz # Same as above
+fi
+
+tar -xf binutils-$BINUTILSVERSION.tar.gz
+tar -xf gcc-$GCCVERSION.tar.gz
+
+rm -rf build-gcc build-binutils
+
+mkdir build-binutils
+cd build-binutils
+../binutils-$BINUTILSVERSION/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
+make
+make install
+cd ..
+
+cd gcc-$GCCVERSION
+contrib/download_prerequisites
+cd ..
+mkdir build-gcc
+cd build-gcc
+../gcc-$GCCVERSION/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c --without-headers
+make all-gcc
+make all-target-libgcc
+make install-gcc
+make install-target-libgcc
tab: 248 wrap: offon