From 2b57c3126aad1c3ee46ba35a931715b4fbd61fab Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 7 Dec 2022 13:53:08 +0200 Subject: [PATCH] Updated libc --- Makefile | 6 +- apps/Makefile | 6 +- apps/base/Makefile | 5 ++ apps/base/echo/Makefile | 83 +++++++++++++++++++++++++ apps/base/echo/echo.cpp | 21 +++++++ apps/system/Makefile | 2 +- apps/system/init/Makefile | 10 +-- apps/system/init/{init.cpp => init.c} | 6 +- apps/system/init/log | 8 +++ libc/Makefile | 8 +-- libc/runtime/Makefile | 11 ++-- libc/runtime/crt0.S | 23 +++++++ libc/runtime/crt0.c | 15 ----- libc/runtime/crt1.S | 23 +++++++ libc/runtime/crt1.c | 15 ----- libc/runtime/crtbegin.S | 14 +++++ libc/runtime/crtbegin.c | 1 - libc/runtime/crtend.S | 8 +++ libc/runtime/crtend.c | 1 - libc/src/InitArray.c | 21 +++++++ libc/src/Makefile | 10 ++- libc/src/Runtime.c | 18 ++++++ libs/Makefile | 8 +++ libs/include/ssp.h | 6 ++ libs/libgcc/Makefile | 44 +++++++++++++ libc/src/main.c => libs/libgcc/cxa.cpp | 0 libs/libssp/Makefile | 44 +++++++++++++ {apps/system/init => libs/libssp}/ssp.c | 8 +-- 28 files changed, 360 insertions(+), 65 deletions(-) create mode 100644 apps/base/Makefile create mode 100644 apps/base/echo/Makefile create mode 100644 apps/base/echo/echo.cpp rename apps/system/init/{init.cpp => init.c} (91%) create mode 100644 apps/system/init/log create mode 100644 libc/runtime/crt0.S delete mode 100644 libc/runtime/crt0.c create mode 100644 libc/runtime/crt1.S delete mode 100644 libc/runtime/crt1.c create mode 100644 libc/runtime/crtbegin.S delete mode 100644 libc/runtime/crtbegin.c create mode 100644 libc/runtime/crtend.S delete mode 100644 libc/runtime/crtend.c create mode 100644 libc/src/InitArray.c create mode 100644 libc/src/Runtime.c create mode 100644 libs/Makefile create mode 100644 libs/include/ssp.h create mode 100644 libs/libgcc/Makefile rename libc/src/main.c => libs/libgcc/cxa.cpp (100%) create mode 100644 libs/libssp/Makefile rename {apps/system/init => libs/libssp}/ssp.c (84%) diff --git a/Makefile b/Makefile index e12a3e3..bf27215 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ build: mkdir -p out/system/lib mkdir -p out/system/include make --quiet -C libc build + make --quiet -C libs build make --quiet -C apps build prepare: @@ -11,5 +12,6 @@ prepare: clean: rm -rf out - make --quiet -C libc clean - make --quiet -C apps clean + make -C libc clean + make -C libs clean + make -C apps clean diff --git a/apps/Makefile b/apps/Makefile index f1cbea0..5c897eb 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -1,7 +1,9 @@ build: make --quiet -C system build + make --quiet -C base build make --quiet -C user build clean: - make --quiet -C system clean - make --quiet -C user clean + make -C system clean + make -C base clean + make -C user clean diff --git a/apps/base/Makefile b/apps/base/Makefile new file mode 100644 index 0000000..0bd52f0 --- /dev/null +++ b/apps/base/Makefile @@ -0,0 +1,5 @@ +build: + make --quiet -C echo build + +clean: + make -C echo clean diff --git a/apps/base/echo/Makefile b/apps/base/echo/Makefile new file mode 100644 index 0000000..fb4e6ce --- /dev/null +++ b/apps/base/echo/Makefile @@ -0,0 +1,83 @@ +# Config file +include ../../../../Makefile.conf + +FILENAME = echo.elf + +SYSROOT = --sysroot=../../../out/system/ + +CC = ../../../../$(COMPILER_PATH)/$(COMPILER_ARCH)gcc +CPP = ../../../../$(COMPILER_PATH)/$(COMPILER_ARCH)g++ +LD = ../../../../$(COMPILER_PATH)/$(COMPILER_ARCH)ld +AS = ../../../../$(COMPILER_PATH)/$(COMPILER_ARCH)as +OBJDUMP = ../../../../$(COMPILER_PATH)/$(COMPILER_ARCH)objdump + +GIT_COMMIT = $(shell git rev-parse HEAD) +GIT_COMMIT_SHORT = $(shell git rev-parse --short HEAD) + +ifeq ($(OSARCH), amd64) +S_SOURCES = $(shell find ./ -type f -name '*.S' -not -path "./arch/i686/*" -not -path "./arch/aarch64/*") +C_SOURCES = $(shell find ./ -type f -name '*.c' -not -path "./arch/i686/*" -not -path "./arch/aarch64/*") +CPP_SOURCES = $(shell find ./ -type f -name '*.cpp' -not -path "./arch/i686/*" -not -path "./arch/aarch64/*") +else ifeq ($(OSARCH), i686) +S_SOURCES = $(shell find ./ -type f -name '*.S' -not -path "./arch/amd64/*" -not -path "./arch/aarch64/*") +C_SOURCES = $(shell find ./ -type f -name '*.c' -not -path "./arch/amd64/*" -not -path "./arch/aarch64/*") +CPP_SOURCES = $(shell find ./ -type f -name '*.cpp' -not -path "./arch/amd64/*" -not -path "./arch/aarch64/*") +else ifeq ($(OSARCH), aarch64) +S_SOURCES = $(shell find ./ -type f -name '*.S' -not -path "./arch/amd64/*" -not -path "./arch/i686/*") +C_SOURCES = $(shell find ./ -type f -name '*.c' -not -path "./arch/amd64/*" -not -path "./arch/i686/*") +CPP_SOURCES = $(shell find ./ -type f -name '*.cpp' -not -path "./arch/amd64/*" -not -path "./arch/i686/*") +endif +HEADERS = $(sort $(dir $(wildcard ../../../out/system/include/*))) +OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(ASM_SOURCES:.asm=.o) $(S_SOURCES:.S=.o) $(PSF_SOURCES:.psf=.o) $(BMP_SOURCES:.bmp=.o) +INCLUDE_DIR = ../../../out/system/include + +LDFLAGS := -Wl,-Map file.map + +WARNCFLAG = -Wall -Wextra -Wno-builtin-declaration-mismatch + +CFLAGS := \ + -I$(INCLUDE_DIR) \ + -DGIT_COMMIT='"$(GIT_COMMIT)"' \ + -DGIT_COMMIT_SHORT='"$(GIT_COMMIT_SHORT)"' + +ifeq ($(OSARCH), amd64) + +CFLAGS += -march=x86-64 + +else ifeq ($(OSARCH), i686) + +CFLAGS += -march=i686 + +else ifeq ($(OSARCH), aarch64) + +CFLAGS += -pipe + +endif + +build: $(FILENAME) + $(OBJDUMP) -d $(FILENAME) > file_dump.map + mv $(FILENAME) ../../../out/system/$(FILENAME) + +$(FILENAME): $(OBJ) + $(CC) $(LDFLAGS) $(SYSROOT) $(OBJ) -o $@ + +%.o: %.c $(HEADERS) + $(info Compiling $<) + $(CC) $(CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@ + +%.o: %.cpp $(HEADERS) + $(info Compiling $<) + $(CPP) $(CFLAGS) $(WARNCFLAG) -std=c++20 -fexceptions -c $< -o $@ -fno-rtti + +%.o: %.S + $(info Compiling $<) +ifeq ($(OSARCH), amd64) + $(AS) -o $@ $< +else ifeq ($(OSARCH), i686) + $(AS) -o $@ $< +else ifeq ($(OSARCH), aarch64) + $(AS) -o $@ $< +endif + +clean: + rm -f *.o file.map file_dump.map $(OBJ) diff --git a/apps/base/echo/echo.cpp b/apps/base/echo/echo.cpp new file mode 100644 index 0000000..cdb25a2 --- /dev/null +++ b/apps/base/echo/echo.cpp @@ -0,0 +1,21 @@ +static inline long syscall2(int sc, long arg1, long arg2) +{ + long ret; + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(sc), "D"(arg1), "S"(arg2) + : "rcx", "r11", "memory"); + return ret; +} + +int main(int argc, char *argv[]) +{ + // TODO: Change this to use stdout + for (int i = 1; i < argc; i++) + { + for (int j = 0; argv[i][j]; j++) + syscall2(1, argv[i][j], 0); + syscall2(1, ' ', 0); + } + return 0; +} diff --git a/apps/system/Makefile b/apps/system/Makefile index c962034..4804516 100644 --- a/apps/system/Makefile +++ b/apps/system/Makefile @@ -2,4 +2,4 @@ build: make --quiet -C init build clean: - make --quiet -C init clean + make -C init clean diff --git a/apps/system/init/Makefile b/apps/system/init/Makefile index 414aa5a..843656e 100644 --- a/apps/system/init/Makefile +++ b/apps/system/init/Makefile @@ -31,7 +31,7 @@ HEADERS = $(sort $(dir $(wildcard ../../../out/system/include/*))) OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(ASM_SOURCES:.asm=.o) $(S_SOURCES:.S=.o) $(PSF_SOURCES:.psf=.o) $(BMP_SOURCES:.bmp=.o) INCLUDE_DIR = ../../../out/system/include -LDFLAGS := -fPIC -Wl,-Map file.map +LDFLAGS := -Wl,-Map file.map WARNCFLAG = -Wall -Wextra -Wno-builtin-declaration-mismatch @@ -42,15 +42,15 @@ CFLAGS := \ ifeq ($(OSARCH), amd64) -CFLAGS += -fPIC -march=x86-64 -fstack-protector-all -fstack-clash-protection +CFLAGS += -march=x86-64 -fstack-protector-all -fstack-clash-protection else ifeq ($(OSARCH), i686) -CFLAGS += -fPIC -march=i686 +CFLAGS += -march=i686 else ifeq ($(OSARCH), aarch64) -CFLAGS += -pipe -fPIC +CFLAGS += -pipe endif @@ -59,7 +59,7 @@ build: $(FILENAME) mv $(FILENAME) ../../../out/system/$(FILENAME) $(FILENAME): $(OBJ) - $(CC) $(LDFLAGS) $(SYSROOT) $(OBJ) -o $@ + $(CC) $(LDFLAGS) $(SYSROOT) $(OBJ) -lssp -o $@ %.o: %.c $(HEADERS) $(info Compiling $<) diff --git a/apps/system/init/init.cpp b/apps/system/init/init.c similarity index 91% rename from apps/system/init/init.cpp rename to apps/system/init/init.c index 7b0de73..648026d 100644 --- a/apps/system/init/init.cpp +++ b/apps/system/init/init.c @@ -58,16 +58,16 @@ static inline long syscall2(int sc, long arg1, long arg2) return ret; } -extern "C" void putchar(char c) { syscall2(1, c, 0); } +void putchar(char c) { syscall2(1, c, 0); } int main(int argc, char *argv[], char *envp[]) { printf_("Hello World!\n"); printf_("I have %d arguments\n", argc); for (int i = 0; i < argc; i++) - printf_("argv[%d] = %s\n", i, argv[i]); + printf_("argv[%d] = (%p) %s\n", i, argv[i], argv[i]); for (int i = 0; envp[i]; i++) - printf_("envp[%d] = %s\n", i, envp[i]); + printf_("envp[%d] = (%p) %s\n", i, envp[i], envp[i]); Elf64_auxv_t *auxv; while (*envp++ != NULL) ; diff --git a/apps/system/init/log b/apps/system/init/log new file mode 100644 index 0000000..780adfe --- /dev/null +++ b/apps/system/init/log @@ -0,0 +1,8 @@ +919707 execve("../../../../tools/cross/bin/amd64-elf-gcc", ["../../../../tools/cross/bin/amd6"..., "-Wl,-Map", "file.map", "-shared", "--sysroot=../../../out/system/", "./printf.o", "./ssp.o", "./init.o", "-o", "init.elf"], ["GDK_BACKEND=x11", "GNOME_SHELL_SESSION_MODE=ubuntu", "SSH_AGENT_LAUNCHER=gnome-keyring", "GJS_DEBUG_OUTPUT=stderr", "MANDATORY_PATH=/usr/share/gconf/"..., "WINDOWPATH=2", "LIBVIRT_DEFAULT_URI=qemu:///syst"..., "GTK3_MODULES=xapp-gtk3-module", "QT_ACCESSIBILITY=1", "VSCODE_GIT_ASKPASS_EXTRA_ARGS=--"..., "PWD=/media/enderice2/SSD250/Fenn"..., "XDG_DATA_DIRS=/usr/share/ubuntu-"..., "LANG=ro_RO.UTF-8", "XAUTHORITY=/run/user/1000/gdm/Xa"..., "MAKEFLAGS=s", "LESSOPEN=| /usr/bin/lesspipe %s", "MFLAGS=-s", "SSH_AUTH_SOCK=/run/user/1000/key"..., "XDG_CONFIG_DIRS=/etc/xdg/xdg-ubu"..., "GIT_ASKPASS=/usr/share/code/reso"..., "XDG_SESSION_DESKTOP=ubuntu-xorg", "ENABLE_VKBASALT=1", "XDG_SESSION_TYPE=x11", "SESSION_MANAGER=local/enderice2-"..., "CHROME_DESKTOP=code-url-handler."..., "DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "GNOME_DESKTOP_SESSION_ID=this-is"..., "SHELL=/bin/bash", "XMODIFIERS=@im=ibus", "DOTNET_BUNDLE_EXTRACT_BASE_DIR=/"..., "GJS_DEBUG_TOPICS=JS ERROR;JS LOG", "SHLVL=1", "PATH=/home/enderice2/.local/bin:"..., "VSCODE_GIT_IPC_HANDLE=/run/user/"..., "VSCODE_GIT_ASKPASS_NODE=/usr/sha"..., "VSCODE_GIT_ASKPASS_MAIN=/usr/sha"..., "INVOCATION_ID=ec0726044e7e4279b4"..., "USERNAME=enderice2", "TERM_PROGRAM=vscode", "LESSCLOSE=/usr/bin/lesspipe %s %"..., "XDG_CURRENT_DESKTOP=Unity", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "DESKTOP_SESSION=ubuntu-xorg", "ORIGINAL_XDG_CURRENT_DESKTOP=ubu"..., "LOGNAME=enderice2", "GIO_LAUNCHED_DESKTOP_FILE=/usr/s"..., "SYSTEMD_EXEC_PID=3170", "DISPLAY=:0", "GTK_MODULES=gail:atk-bridge:appm"..., "USER=enderice2", "DEFAULTS_PATH=/usr/share/gconf/u"..., "QT_FONT_DPI=96", "MANAGERPID=2831", "GIO_LAUNCHED_DESKTOP_FILE_PID=10"..., "QT_STYLE_OVERRIDE=kvantum", "_=/usr/bin/make", "MAKE_TERMOUT=/dev/pts/1", "XDG_RUNTIME_DIR=/run/user/1000", "GPG_AGENT_INFO=/run/user/1000/gn"..., "COLORTERM=truecolor", "JOURNAL_STREAM=8:44860", "MAKE_TERMERR=/dev/pts/1", "XDG_SESSION_CLASS=user", "HOME=/home/enderice2", "QT_IM_MODULE=ibus", "TERM=xterm-256color", "IM_CONFIG_PHASE=1", "XDG_MENU_PREFIX=gnome-", "TERM_PROGRAM_VERSION=1.73.1", "DOTNET_ROOT=/usr/lib/dotnet/dotn"..., "GDMSESSION=ubuntu-xorg", "MAKELEVEL=5"]) = 0 +919708 execve("/media/enderice2/SSD250/Fennix/tools/cross/libexec/gcc/amd64-elf/13.0.0/collect2", ["/media/enderice2/SSD250/Fennix/t"..., "-plugin", "/media/enderice2/SSD250/Fennix/t"..., "-plugin-opt=/media/enderice2/SSD"..., "-plugin-opt=-fresolution=/tmp/cc"..., "-plugin-opt=-pass-through=-lgcc", "-plugin-opt=-pass-through=-lgcc", "--sysroot=../../../out/system/", "-o", "init.elf", "../../../out/system/lib/crtbegin"..., "-L/media/enderice2/SSD250/Fennix"..., "-L/media/enderice2/SSD250/Fennix"..., "-L../../../out/system/lib", "-Map", "file.map", "./printf.o", "./ssp.o", "./init.o", "-lgcc", "-lgcc", "../../../out/system/lib/crtend.o"], ["GDK_BACKEND=x11", "GNOME_SHELL_SESSION_MODE=ubuntu", "SSH_AGENT_LAUNCHER=gnome-keyring", "GJS_DEBUG_OUTPUT=stderr", "MANDATORY_PATH=/usr/share/gconf/"..., "WINDOWPATH=2", "LIBVIRT_DEFAULT_URI=qemu:///syst"..., "GTK3_MODULES=xapp-gtk3-module", "QT_ACCESSIBILITY=1", "VSCODE_GIT_ASKPASS_EXTRA_ARGS=--"..., "PWD=/media/enderice2/SSD250/Fenn"..., "XDG_DATA_DIRS=/usr/share/ubuntu-"..., "LANG=ro_RO.UTF-8", "XAUTHORITY=/run/user/1000/gdm/Xa"..., "MAKEFLAGS=s", "LESSOPEN=| /usr/bin/lesspipe %s", "MFLAGS=-s", "SSH_AUTH_SOCK=/run/user/1000/key"..., "XDG_CONFIG_DIRS=/etc/xdg/xdg-ubu"..., "GIT_ASKPASS=/usr/share/code/reso"..., "XDG_SESSION_DESKTOP=ubuntu-xorg", "ENABLE_VKBASALT=1", "XDG_SESSION_TYPE=x11", "SESSION_MANAGER=local/enderice2-"..., "CHROME_DESKTOP=code-url-handler."..., "DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "GNOME_DESKTOP_SESSION_ID=this-is"..., "SHELL=/bin/bash", "XMODIFIERS=@im=ibus", "DOTNET_BUNDLE_EXTRACT_BASE_DIR=/"..., "GJS_DEBUG_TOPICS=JS ERROR;JS LOG", "SHLVL=1", "PATH=/home/enderice2/.local/bin:"..., "VSCODE_GIT_IPC_HANDLE=/run/user/"..., "VSCODE_GIT_ASKPASS_NODE=/usr/sha"..., "VSCODE_GIT_ASKPASS_MAIN=/usr/sha"..., "INVOCATION_ID=ec0726044e7e4279b4"..., "USERNAME=enderice2", "TERM_PROGRAM=vscode", "LESSCLOSE=/usr/bin/lesspipe %s %"..., "XDG_CURRENT_DESKTOP=Unity", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "DESKTOP_SESSION=ubuntu-xorg", "ORIGINAL_XDG_CURRENT_DESKTOP=ubu"..., "LOGNAME=enderice2", "GIO_LAUNCHED_DESKTOP_FILE=/usr/s"..., "SYSTEMD_EXEC_PID=3170", "DISPLAY=:0", "GTK_MODULES=gail:atk-bridge:appm"..., "USER=enderice2", "DEFAULTS_PATH=/usr/share/gconf/u"..., "QT_FONT_DPI=96", "MANAGERPID=2831", "GIO_LAUNCHED_DESKTOP_FILE_PID=10"..., "QT_STYLE_OVERRIDE=kvantum", "_=/usr/bin/make", "MAKE_TERMOUT=/dev/pts/1", "XDG_RUNTIME_DIR=/run/user/1000", "GPG_AGENT_INFO=/run/user/1000/gn"..., "COLORTERM=truecolor", "JOURNAL_STREAM=8:44860", "MAKE_TERMERR=/dev/pts/1", "XDG_SESSION_CLASS=user", "HOME=/home/enderice2", "QT_IM_MODULE=ibus", "TERM=xterm-256color", "IM_CONFIG_PHASE=1", "XDG_MENU_PREFIX=gnome-", "TERM_PROGRAM_VERSION=1.73.1", "DOTNET_ROOT=/usr/lib/dotnet/dotn"..., "GDMSESSION=ubuntu-xorg", "MAKELEVEL=5", "COLLECT_GCC=../../../../tools/cr"..., "COLLECT_LTO_WRAPPER=/media/ender"..., "COMPILER_PATH=/media/enderice2/S"..., "LIBRARY_PATH=/media/enderice2/SS"..., "COLLECT_GCC_OPTIONS='-shared' '-"...]) = 0 +919709 execve("/media/enderice2/SSD250/Fennix/tools/cross/lib/gcc/amd64-elf/13.0.0/../../../../amd64-elf/bin/ld", ["/media/enderice2/SSD250/Fennix/t"..., "-plugin", "/media/enderice2/SSD250/Fennix/t"..., "-plugin-opt=/media/enderice2/SSD"..., "-plugin-opt=-fresolution=/tmp/cc"..., "-plugin-opt=-pass-through=-lgcc", "-plugin-opt=-pass-through=-lgcc", "--sysroot=../../../out/system/", "-o", "init.elf", "../../../out/system/lib/crtbegin"..., "-L/media/enderice2/SSD250/Fennix"..., "-L/media/enderice2/SSD250/Fennix"..., "-L../../../out/system/lib", "-Map", "file.map", "./printf.o", "./ssp.o", "./init.o", "-lgcc", "-lgcc", "../../../out/system/lib/crtend.o"], ["GDK_BACKEND=x11", "GNOME_SHELL_SESSION_MODE=ubuntu", "SSH_AGENT_LAUNCHER=gnome-keyring", "GJS_DEBUG_OUTPUT=stderr", "MANDATORY_PATH=/usr/share/gconf/"..., "WINDOWPATH=2", "LIBVIRT_DEFAULT_URI=qemu:///syst"..., "GTK3_MODULES=xapp-gtk3-module", "QT_ACCESSIBILITY=1", "VSCODE_GIT_ASKPASS_EXTRA_ARGS=--"..., "PWD=/media/enderice2/SSD250/Fenn"..., "XDG_DATA_DIRS=/usr/share/ubuntu-"..., "LANG=ro_RO.UTF-8", "XAUTHORITY=/run/user/1000/gdm/Xa"..., "MAKEFLAGS=s", "LESSOPEN=| /usr/bin/lesspipe %s", "MFLAGS=-s", "SSH_AUTH_SOCK=/run/user/1000/key"..., "XDG_CONFIG_DIRS=/etc/xdg/xdg-ubu"..., "GIT_ASKPASS=/usr/share/code/reso"..., "XDG_SESSION_DESKTOP=ubuntu-xorg", "ENABLE_VKBASALT=1", "XDG_SESSION_TYPE=x11", "SESSION_MANAGER=local/enderice2-"..., "CHROME_DESKTOP=code-url-handler."..., "DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "GNOME_DESKTOP_SESSION_ID=this-is"..., "SHELL=/bin/bash", "XMODIFIERS=@im=ibus", "DOTNET_BUNDLE_EXTRACT_BASE_DIR=/"..., "GJS_DEBUG_TOPICS=JS ERROR;JS LOG", "SHLVL=1", "PATH=/home/enderice2/.local/bin:"..., "VSCODE_GIT_IPC_HANDLE=/run/user/"..., "VSCODE_GIT_ASKPASS_NODE=/usr/sha"..., "VSCODE_GIT_ASKPASS_MAIN=/usr/sha"..., "INVOCATION_ID=ec0726044e7e4279b4"..., "USERNAME=enderice2", "TERM_PROGRAM=vscode", "LESSCLOSE=/usr/bin/lesspipe %s %"..., "XDG_CURRENT_DESKTOP=Unity", "LS_COLORS=rs=0:di=01;34:ln=01;36"..., "DESKTOP_SESSION=ubuntu-xorg", "ORIGINAL_XDG_CURRENT_DESKTOP=ubu"..., "LOGNAME=enderice2", "GIO_LAUNCHED_DESKTOP_FILE=/usr/s"..., "SYSTEMD_EXEC_PID=3170", "DISPLAY=:0", "GTK_MODULES=gail:atk-bridge:appm"..., "USER=enderice2", "DEFAULTS_PATH=/usr/share/gconf/u"..., "QT_FONT_DPI=96", "MANAGERPID=2831", "GIO_LAUNCHED_DESKTOP_FILE_PID=10"..., "QT_STYLE_OVERRIDE=kvantum", "_=/usr/bin/make", "MAKE_TERMOUT=/dev/pts/1", "XDG_RUNTIME_DIR=/run/user/1000", "GPG_AGENT_INFO=/run/user/1000/gn"..., "COLORTERM=truecolor", "JOURNAL_STREAM=8:44860", "MAKE_TERMERR=/dev/pts/1", "XDG_SESSION_CLASS=user", "HOME=/home/enderice2", "QT_IM_MODULE=ibus", "TERM=xterm-256color", "IM_CONFIG_PHASE=1", "XDG_MENU_PREFIX=gnome-", "TERM_PROGRAM_VERSION=1.73.1", "DOTNET_ROOT=/usr/lib/dotnet/dotn"..., "GDMSESSION=ubuntu-xorg", "MAKELEVEL=5", "COLLECT_GCC=../../../../tools/cr"..., "COLLECT_LTO_WRAPPER=/media/ender"..., "COMPILER_PATH=/media/enderice2/S"..., "LIBRARY_PATH=/media/enderice2/SS"..., "COLLECT_GCC_OPTIONS='-shared' '-"..., "COLLECT_NO_DEMANGLE=1"]) = 0 +919709 +++ exited with 0 +++ +919708 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=919709, si_uid=1000, si_status=0, si_utime=0, si_stime=0} --- +919708 +++ exited with 0 +++ +919707 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=919708, si_uid=1000, si_status=0, si_utime=0, si_stime=0} --- +919707 +++ exited with 0 +++ diff --git a/libc/Makefile b/libc/Makefile index 7f2eaea..068c095 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -1,12 +1,8 @@ build: cp include/* ../out/system/include make --quiet -C runtime build - make --quiet -C libgcc build - make --quiet -C libssp build make --quiet -C src build clean: - make --quiet -C runtime clean - make --quiet -C libgcc clean - make --quiet -C libssp clean - make --quiet -C src clean + make -C runtime clean + make -C src clean diff --git a/libc/runtime/Makefile b/libc/runtime/Makefile index 2daae15..f2da55a 100644 --- a/libc/runtime/Makefile +++ b/libc/runtime/Makefile @@ -2,12 +2,13 @@ include ../../../Makefile.conf CC = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)gcc +AS = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)as NASM = /usr/bin/nasm C_SOURCES = $(shell find ./ -type f -name '*.c') -S_SOURCES = $(shell find ./ -type f -name '*.s') +S_SOURCES = $(shell find ./ -type f -name '*.S') ASM_SOURCES = $(shell find ./ -type f -name '*.asm') -OBJ = ${C_SOURCES:.c=.o} ${ASM_SOURCES:.asm=.o} ${S_SOURCES:.s=.o} +OBJ = ${C_SOURCES:.c=.o} ${ASM_SOURCES:.asm=.o} ${S_SOURCES:.S=.o} ifeq ($(OSARCH), amd64) ASM_ARCH := elf64 @@ -19,13 +20,13 @@ build: $(OBJ) mv $^ ../../out/system/lib/ %.o: %.c - $(CC) -nostdlib -std=c17 -c $< -o $@ + $(CC) -nostdlib -mno-red-zone -std=c17 -c $< -o $@ %.o: %.asm $(NASM) $< -f $(ASM_ARCH) -o $@ -%.bin: %.s - $(NASM) $< -f $(ASM_ARCH) -o $@ +%.o: %.S + $(AS) -c $< -o $@ clean: diff --git a/libc/runtime/crt0.S b/libc/runtime/crt0.S new file mode 100644 index 0000000..05ec47b --- /dev/null +++ b/libc/runtime/crt0.S @@ -0,0 +1,23 @@ +# https://wiki.osdev.org/Creating_a_C_Library +.section .text + +.global _start +_start: + movq $0, %rbp + pushq %rbp + pushq %rbp + movq %rsp, %rbp + + pushq %rsi + pushq %rdi + + call __libc_init + call _init + + popq %rdi + popq %rsi + + call main + movl %eax, %edi + call _exit +.size _start, . - _start diff --git a/libc/runtime/crt0.c b/libc/runtime/crt0.c deleted file mode 100644 index eb76588..0000000 --- a/libc/runtime/crt0.c +++ /dev/null @@ -1,15 +0,0 @@ -int main(int argc, char *argv[], char *envp[]); - -void _start() -{ - register int argc __asm__("rdi"); - register char **argv __asm__("rsi"); - register char **envp __asm__("rdx"); - int mainret = main((int)argc, (char **)argv, (char **)envp); - __asm__ __volatile__("syscall" - : - : "a"(0), "D"(mainret) - : "rcx", "r11", "memory"); - return; -} -// C stuff \ No newline at end of file diff --git a/libc/runtime/crt1.S b/libc/runtime/crt1.S new file mode 100644 index 0000000..05ec47b --- /dev/null +++ b/libc/runtime/crt1.S @@ -0,0 +1,23 @@ +# https://wiki.osdev.org/Creating_a_C_Library +.section .text + +.global _start +_start: + movq $0, %rbp + pushq %rbp + pushq %rbp + movq %rsp, %rbp + + pushq %rsi + pushq %rdi + + call __libc_init + call _init + + popq %rdi + popq %rsi + + call main + movl %eax, %edi + call _exit +.size _start, . - _start diff --git a/libc/runtime/crt1.c b/libc/runtime/crt1.c deleted file mode 100644 index cf9104b..0000000 --- a/libc/runtime/crt1.c +++ /dev/null @@ -1,15 +0,0 @@ -int main(int argc, char *argv[], char *envp[]); - -void _start() -{ - register int argc __asm__("rdi"); - register char **argv __asm__("rsi"); - register char **envp __asm__("rdx"); - int mainret = main((int)argc, (char **)argv, (char **)envp); - __asm__ __volatile__("syscall" - : - : "a"(0), "D"(mainret) - : "rcx", "r11", "memory"); - return; -} -// C++ stuff \ No newline at end of file diff --git a/libc/runtime/crtbegin.S b/libc/runtime/crtbegin.S new file mode 100644 index 0000000..149fef2 --- /dev/null +++ b/libc/runtime/crtbegin.S @@ -0,0 +1,14 @@ +# I WILL PLACE HERE THE crti.o BECAUSE GCC REFUSE TO LINK IT AND I DON'T KNOW WHY +.section .init +.global _init +.type _init, @function +_init: + push %rbp + movq %rsp, %rbp + +.section .fini +.global _fini +.type _fini, @function +_fini: + push %rbp + movq %rsp, %rbp diff --git a/libc/runtime/crtbegin.c b/libc/runtime/crtbegin.c deleted file mode 100644 index 507125b..0000000 --- a/libc/runtime/crtbegin.c +++ /dev/null @@ -1 +0,0 @@ -// C++ constructor/destructor stuff \ No newline at end of file diff --git a/libc/runtime/crtend.S b/libc/runtime/crtend.S new file mode 100644 index 0000000..3f911fa --- /dev/null +++ b/libc/runtime/crtend.S @@ -0,0 +1,8 @@ +# I WILL PLACE HERE THE crtn.o BECAUSE GCC REFUSE TO LINK IT AND I DON'T KNOW WHY +.section .init + popq %rbp + ret + +.section .fini + popq %rbp + ret diff --git a/libc/runtime/crtend.c b/libc/runtime/crtend.c deleted file mode 100644 index 507125b..0000000 --- a/libc/runtime/crtend.c +++ /dev/null @@ -1 +0,0 @@ -// C++ constructor/destructor stuff \ No newline at end of file diff --git a/libc/src/InitArray.c b/libc/src/InitArray.c new file mode 100644 index 0000000..32651f4 --- /dev/null +++ b/libc/src/InitArray.c @@ -0,0 +1,21 @@ +extern void (*__preinit_array_start[])(void) __attribute__((weak)); +extern void (*__preinit_array_end[])(void) __attribute__((weak)); +extern void (*__init_array_start[])(void) __attribute__((weak)); +extern void (*__init_array_end[])(void) __attribute__((weak)); +extern void (*__fini_array_start []) (void) __attribute__((weak)); +extern void (*__fini_array_end []) (void) __attribute__((weak)); + +extern void _init(void); + +void __libc_init_array(void) +{ + unsigned long Count = __preinit_array_end - __preinit_array_start; + for (unsigned long i = 0; i < Count; i++) + __preinit_array_start[i](); + + _init(); + + Count = __init_array_end - __init_array_start; + for (unsigned long i = 0; i < Count; i++) + __init_array_start[i](); +} diff --git a/libc/src/Makefile b/libc/src/Makefile index 73de042..22828f1 100644 --- a/libc/src/Makefile +++ b/libc/src/Makefile @@ -8,13 +8,14 @@ OBJECT_NAME=lib$(NAME).a OUTPUT_DIR=../../out/system/lib/ CC = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)gcc +AS = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)as AR = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)ar NASM = /usr/bin/nasm C_SOURCES = $(shell find ./ -type f -name '*.c') -S_SOURCES = $(shell find ./ -type f -name '*.s') +S_SOURCES = $(shell find ./ -type f -name '*.S') ASM_SOURCES = $(shell find ./ -type f -name '*.asm') -OBJ = ${C_SOURCES:.c=.o} ${ASM_SOURCES:.asm=.o} ${S_SOURCES:.s=.o} +OBJ = ${C_SOURCES:.c=.o} ${ASM_SOURCES:.asm=.o} ${S_SOURCES:.S=.o} INCLUDE_DIR = ../include @@ -24,7 +25,7 @@ else ifeq ($(OSARCH), i686) ASM_ARCH := elf32 endif -CFLAGS := -fPIC -I$(INCLUDE_DIR) +CFLAGS := -fPIC -mno-red-zone -I$(INCLUDE_DIR) build: $(OBJECT_NAME) @@ -37,6 +38,9 @@ $(OBJECT_NAME): $(OBJ) %.o: %.cpp $(HEADERS) $(HEADERS2) $(CC) $(CFLAGS) -std=c++20 -c $< -o $@ +%.o: %.S + $(AS) -c $< -o $@ + %.o: %.asm $(NASM) $< -f $(ASM_ARCH) -o $@ diff --git a/libc/src/Runtime.c b/libc/src/Runtime.c new file mode 100644 index 0000000..15efae2 --- /dev/null +++ b/libc/src/Runtime.c @@ -0,0 +1,18 @@ + +extern void __libc_init_array(); + +void __libc_init() +{ + __libc_init_array(); +} + +void _exit(int Code) +{ + __asm__ __volatile__("syscall" + : + : "a"(0), "D"(Code) + : "rcx", "r11", "memory"); + + while (1) + __asm__ __volatile__("hlt"); +} diff --git a/libs/Makefile b/libs/Makefile new file mode 100644 index 0000000..5d7ff80 --- /dev/null +++ b/libs/Makefile @@ -0,0 +1,8 @@ +build: + cp include/* ../out/system/include + make --quiet -C libgcc build + make --quiet -C libssp build + +clean: + make -C libgcc clean + make -C libssp clean diff --git a/libs/include/ssp.h b/libs/include/ssp.h new file mode 100644 index 0000000..7ddaed5 --- /dev/null +++ b/libs/include/ssp.h @@ -0,0 +1,6 @@ +#ifndef __FENNIX_LIBS_SSP_H__ +#define __FENNIX_LIBS_SSP_H__ + +#include + +#endif // !__FENNIX_LIBS_SSP_H__ diff --git a/libs/libgcc/Makefile b/libs/libgcc/Makefile new file mode 100644 index 0000000..08a0e7e --- /dev/null +++ b/libs/libgcc/Makefile @@ -0,0 +1,44 @@ +# Config file +include ../../../Makefile.conf + +NAME=gcc + +OBJECT_NAME=lib$(NAME).a + +OUTPUT_DIR=../../out/system/lib/ + +CC = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)gcc +AR = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)ar +NASM = /usr/bin/nasm + +C_SOURCES = $(shell find ./ -type f -name '*.c') +S_SOURCES = $(shell find ./ -type f -name '*.s') +ASM_SOURCES = $(shell find ./ -type f -name '*.asm') +OBJ = ${C_SOURCES:.c=.o} ${ASM_SOURCES:.asm=.o} ${S_SOURCES:.s=.o} + +INCLUDE_DIR = ../include + +ifeq ($(OSARCH), amd64) +ASM_ARCH := elf64 +else ifeq ($(OSARCH), i686) +ASM_ARCH := elf32 +endif + +CFLAGS := -fPIC -I$(INCLUDE_DIR) + +build: $(OBJECT_NAME) + +$(OBJECT_NAME): $(OBJ) + $(AR) rcs $(OUTPUT_DIR)$@ $(OBJ) + +%.o: %.c $(HEADERS) $(HEADERS2) + $(CC) $(CFLAGS) -std=c17 -c $< -o $@ + +%.o: %.cpp $(HEADERS) $(HEADERS2) + $(CC) $(CFLAGS) -std=c++20 -c $< -o $@ + +%.o: %.asm + $(NASM) $< -f $(ASM_ARCH) -o $@ + +clean: + diff --git a/libc/src/main.c b/libs/libgcc/cxa.cpp similarity index 100% rename from libc/src/main.c rename to libs/libgcc/cxa.cpp diff --git a/libs/libssp/Makefile b/libs/libssp/Makefile new file mode 100644 index 0000000..c31b837 --- /dev/null +++ b/libs/libssp/Makefile @@ -0,0 +1,44 @@ +# Config file +include ../../../Makefile.conf + +NAME=ssp + +OBJECT_NAME=lib$(NAME).a + +OUTPUT_DIR=../../out/system/lib/ + +CC = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)gcc +AR = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)ar +NASM = /usr/bin/nasm + +C_SOURCES = $(shell find ./ -type f -name '*.c') +S_SOURCES = $(shell find ./ -type f -name '*.s') +ASM_SOURCES = $(shell find ./ -type f -name '*.asm') +OBJ = ${C_SOURCES:.c=.o} ${ASM_SOURCES:.asm=.o} ${S_SOURCES:.s=.o} + +INCLUDE_DIR = ../include + +ifeq ($(OSARCH), amd64) +ASM_ARCH := elf64 +else ifeq ($(OSARCH), i686) +ASM_ARCH := elf32 +endif + +CFLAGS := -fPIC -I$(INCLUDE_DIR) + +build: $(OBJECT_NAME) + +$(OBJECT_NAME): $(OBJ) + $(AR) rcs $(OUTPUT_DIR)$@ $(OBJ) + +%.o: %.c $(HEADERS) $(HEADERS2) + $(CC) $(CFLAGS) -std=c17 -c $< -o $@ + +%.o: %.cpp $(HEADERS) $(HEADERS2) + $(CC) $(CFLAGS) -std=c++20 -c $< -o $@ + +%.o: %.asm + $(NASM) $< -f $(ASM_ARCH) -o $@ + +clean: + diff --git a/apps/system/init/ssp.c b/libs/libssp/ssp.c similarity index 84% rename from apps/system/init/ssp.c rename to libs/libssp/ssp.c index e7489c6..e96911d 100644 --- a/apps/system/init/ssp.c +++ b/libs/libssp/ssp.c @@ -16,22 +16,18 @@ static void __attribute__((constructor, no_stack_protector)) __guard_setup(void) __attribute__((weak, noreturn, no_stack_protector)) void __stack_chk_fail(void) { - // const char *msg = "Stack smashing detected"; + const char *msg = "Stack smashing detected"; __asm__ __volatile__("syscall" : : "a"(0), "D"(0x57AC) : "rcx", "r11", "memory"); - while (1) - ; } __attribute__((weak, noreturn, no_stack_protector)) void __chk_fail(void) { - // const char *msg = "Buffer overflow detected"; + const char *msg = "Buffer overflow detected"; __asm__ __volatile__("syscall" : : "a"(0), "D"(0xF700) : "rcx", "r11", "memory"); - while (1) - ; }