diff --git a/AK/StdLibExtras.cpp b/AK/StdLibExtras.cpp index 164c2b5ee8..b807d5ebb9 100644 --- a/AK/StdLibExtras.cpp +++ b/AK/StdLibExtras.cpp @@ -52,6 +52,8 @@ void* mmx_memcpy(void* dest, const void* src, size_t len) return dest; } +#ifdef KERNEL + static inline uint32_t divq(uint64_t n, uint32_t d) { uint32_t n1 = n >> 32; @@ -144,5 +146,6 @@ uint64_t __udivmoddi4(uint64_t n, uint64_t d, uint64_t* r) return q; } +#endif } diff --git a/AK/kmalloc.cpp b/AK/kmalloc.cpp index e510a9314e..e08c7fd8cb 100644 --- a/AK/kmalloc.cpp +++ b/AK/kmalloc.cpp @@ -46,36 +46,6 @@ void* kmalloc_eternal(size_t size) } -void* operator new(size_t size) -{ - return kmalloc(size); -} - -void* operator new[](size_t size) -{ - return kmalloc(size); -} - -void operator delete(void* ptr) -{ - return kfree(ptr); -} - -void operator delete[](void* ptr) -{ - return kfree(ptr); -} - -void operator delete(void* ptr, size_t) -{ - return kfree(ptr); -} - -void operator delete[](void* ptr, size_t) -{ - return kfree(ptr); -} - #else extern "C" { diff --git a/AK/kmalloc.h b/AK/kmalloc.h index f02e591dfd..e1bd7126f7 100644 --- a/AK/kmalloc.h +++ b/AK/kmalloc.h @@ -1,5 +1,9 @@ #pragma once +#ifndef KERNEL +#include +#endif + #if defined(SERENITY) && defined(KERNEL) #define AK_MAKE_ETERNAL \ public: \ @@ -23,6 +27,31 @@ void kfree(void* ptr); } +#ifdef KERNEL inline void* operator new(size_t, void* p) { return p; } inline void* operator new[](size_t, void* p) { return p; } +#else + +inline void* operator new(size_t size) +{ + return kmalloc(size); +} + +inline void operator delete(void* ptr) +{ + return kfree(ptr); +} + +inline void* operator new[](size_t size) +{ + return kmalloc(size); +} + +inline void operator delete[](void* ptr) +{ + return kfree(ptr); +} + +#endif + #endif diff --git a/Applications/About/Makefile b/Applications/About/Makefile index a5aebd48a1..b656c4bc66 100644 --- a/Applications/About/Makefile +++ b/Applications/About/Makefile @@ -13,8 +13,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld -AR = i686-pc-serenity-ar +LD = i686-pc-serenity-g++ LDFLAGS = -L../../LibC -L../../LibGUI all: $(APP) diff --git a/Applications/FileManager/Makefile b/Applications/FileManager/Makefile index 4d435c5903..e9b229d9fb 100644 --- a/Applications/FileManager/Makefile +++ b/Applications/FileManager/Makefile @@ -15,8 +15,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld -AR = i686-pc-serenity-ar +LD = i686-pc-serenity-g++ LDFLAGS = -L../../LibC -L../../LibGUI all: $(APP) diff --git a/Applications/FontEditor/Makefile b/Applications/FontEditor/Makefile index dda8ad1ce6..b7e27cbfb9 100644 --- a/Applications/FontEditor/Makefile +++ b/Applications/FontEditor/Makefile @@ -14,7 +14,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld +LD = i686-pc-serenity-g++ AR = i686-pc-serenity-ar LDFLAGS = -L../../LibC -L../../LibGUI diff --git a/Applications/IRCClient/Makefile b/Applications/IRCClient/Makefile index ae25037cf1..b86c193838 100644 --- a/Applications/IRCClient/Makefile +++ b/Applications/IRCClient/Makefile @@ -22,7 +22,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld +LD = i686-pc-serenity-g++ AR = i686-pc-serenity-ar LDFLAGS = -L../../LibC -L../../LibGUI diff --git a/Applications/Launcher/Makefile b/Applications/Launcher/Makefile index dd93622800..65a86c9074 100644 --- a/Applications/Launcher/Makefile +++ b/Applications/Launcher/Makefile @@ -13,8 +13,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld -AR = i686-pc-serenity-ar +LD = i686-pc-serenity-g++ LDFLAGS = -L../../LibC -L../../LibGUI all: $(APP) diff --git a/Applications/ProcessManager/Makefile b/Applications/ProcessManager/Makefile index b594f90ff4..66137bc38e 100644 --- a/Applications/ProcessManager/Makefile +++ b/Applications/ProcessManager/Makefile @@ -16,8 +16,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld -AR = i686-pc-serenity-ar +LD = i686-pc-serenity-g++ LDFLAGS = -L../../LibC -L../../LibGUI all: $(APP) diff --git a/Applications/Terminal/Makefile b/Applications/Terminal/Makefile index d1c10de1e1..28d161d099 100644 --- a/Applications/Terminal/Makefile +++ b/Applications/Terminal/Makefile @@ -14,8 +14,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld -AR = i686-pc-serenity-ar +LD = i686-pc-serenity-g++ LDFLAGS = -L../../LibC -L../../LibGUI all: $(APP) diff --git a/Applications/TextEditor/Makefile b/Applications/TextEditor/Makefile index f017bcb9dd..48c77b8a68 100644 --- a/Applications/TextEditor/Makefile +++ b/Applications/TextEditor/Makefile @@ -13,8 +13,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld -AR = i686-pc-serenity-ar +LD = i686-pc-serenity-g++ LDFLAGS = -L../../LibC -L../../LibGUI all: $(APP) diff --git a/Kernel/makeall.sh b/Kernel/makeall.sh index 20f0c6335f..8747228493 100755 --- a/Kernel/makeall.sh +++ b/Kernel/makeall.sh @@ -10,8 +10,6 @@ $make_cmd -C ../LibC && \ $make_cmd -C ../LibM clean && \ $make_cmd -C ../LibM && \ (cd ../LibM && ./install.sh) && \ -$make_cmd -C ../LibM clean && \ -$make_cmd -C ../LibM clean && \ $make_cmd -C ../Servers/LookupServer clean && \ $make_cmd -C ../Servers/LookupServer && \ $make_cmd -C ../Servers/WindowServer clean && \ diff --git a/LibC/.gitignore b/LibC/.gitignore index 34cdcf1531..e10af1241f 100644 --- a/LibC/.gitignore +++ b/LibC/.gitignore @@ -1,4 +1,5 @@ *.o *.no +*.ao *.d libc.a diff --git a/LibC/Makefile b/LibC/Makefile index 471e70c205..d75ef1f585 100644 --- a/LibC/Makefile +++ b/LibC/Makefile @@ -40,17 +40,16 @@ LIBC_OBJS = \ poll.o \ locale.o \ arpa/inet.o \ - netdb.o \ - crt0.o + netdb.o -ASM_OBJS = setjmp.no +ASM_OBJS = setjmp.no crti.ao crtn.ao CPP_OBJS = $(AK_OBJS) $(WIDGETS_OBJS) $(LIBC_OBJS) LIBRARY = libc.a STANDARD_FLAGS = -std=c++17 WARNING_FLAGS = -Wextra -Wall -Wundef -Wcast-qual -Wwrite-strings -Wimplicit-fallthrough -FLAVOR_FLAGS = -fno-exceptions -fno-rtti +FLAVOR_FLAGS = -fno-exceptions -fno-rtti -fno-sized-deallocation OPTIMIZATION_FLAGS = -Os INCLUDE_FLAGS = -I.. -I. @@ -60,8 +59,14 @@ CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STA CXX = i686-pc-serenity-g++ LD = i686-pc-serenity-ld AR = i686-pc-serenity-ar +AS = i686-pc-serenity-as -all: $(LIBRARY) +all: $(LIBRARY) startfiles + +startfiles: + @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o crt0.o -c crt0.cpp + cp crti.ao crti.o + cp crtn.ao crtn.o $(LIBRARY): $(CPP_OBJS) $(ASM_OBJS) @echo "LIB $@"; $(AR) rcs $@ $(CPP_OBJS) $(ASM_OBJS) @@ -72,6 +77,9 @@ $(LIBRARY): $(CPP_OBJS) $(ASM_OBJS) %.no: %.asm @echo "NASM $@"; nasm -f elf -o $@ $< +%.ao: %.S + @echo "AS $@"; $(AS) -o $@ $< + -include $(OBJS:%.o=%.d) clean: diff --git a/LibC/SharedBuffer.cpp b/LibC/SharedBuffer.cpp index dad0841499..3df9a3b239 100644 --- a/LibC/SharedBuffer.cpp +++ b/LibC/SharedBuffer.cpp @@ -1,6 +1,7 @@ #include #include #include +#include RetainPtr SharedBuffer::create(pid_t peer, int size) { diff --git a/LibC/crt0.cpp b/LibC/crt0.cpp index a607390e14..10176515d3 100644 --- a/LibC/crt0.cpp +++ b/LibC/crt0.cpp @@ -10,17 +10,31 @@ int errno; char** environ; //bool __environ_is_malloced; -void __malloc_init(); -void __stdio_init(); +void __libc_init() +{ + void __malloc_init(); + __malloc_init(); + + void __stdio_init(); + __stdio_init(); +} int _start(int argc, char** argv, char** env) { - errno = 0; environ = env; //__environ_is_malloced = false; - __stdio_init(); - __malloc_init(); + __libc_init(); + + extern void _init(); + _init(); + + extern void (*__init_array_start[])(int, char**, char**) __attribute__((visibility("hidden"))); + extern void (*__init_array_end[])(int, char**, char**) __attribute__((visibility("hidden"))); + + const size_t size = __init_array_end - __init_array_start; + for (size_t i = 0; i < size; i++) + (*__init_array_start[i])(argc, argv, env); int status = main(argc, argv); @@ -37,4 +51,8 @@ int _start(int argc, char** argv, char** env) assert(false); } +void __cxa_atexit() +{ +} + } diff --git a/LibC/crti.S b/LibC/crti.S new file mode 100644 index 0000000000..a67c77c71c --- /dev/null +++ b/LibC/crti.S @@ -0,0 +1,9 @@ +.global _init +.section .init +_init: + push %ebp + +.global _fini +.section .fini +_fini: + push %ebp diff --git a/LibC/crtn.S b/LibC/crtn.S new file mode 100644 index 0000000000..5fdc3d08a0 --- /dev/null +++ b/LibC/crtn.S @@ -0,0 +1,7 @@ +.section .init + pop %ebp + ret + +.section .fini + pop %ebp + ret diff --git a/LibC/install.sh b/LibC/install.sh index f2d52755dd..8b78656ecf 100755 --- a/LibC/install.sh +++ b/LibC/install.sh @@ -10,3 +10,5 @@ cp arpa/*.h ../Root/usr/include/arpa/ cp netinet/*.h ../Root/usr/include/netinet/ cp libc.a ../Root/usr/lib/ cp crt0.o ../Root/usr/lib/ +cp crti.ao ../Root/usr/lib/crti.o +cp crtn.ao ../Root/usr/lib/crtn.o diff --git a/Servers/LookupServer/Makefile b/Servers/LookupServer/Makefile index b82f3afe70..e415e01a47 100644 --- a/Servers/LookupServer/Makefile +++ b/Servers/LookupServer/Makefile @@ -8,14 +8,14 @@ STANDARD_FLAGS = -std=c++17 WARNING_FLAGS = -Wextra -Wall -Wundef -Wcast-qual -Wwrite-strings -Wimplicit-fallthrough FLAVOR_FLAGS = -fno-exceptions -fno-rtti OPTIMIZATION_FLAGS = -Os -INCLUDE_FLAGS = -I../../ -I. -I../../LibC +INCLUDE_FLAGS = -I.. -I../.. -I. -I../../LibC LDFLAGS = -L../../LibC DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld +LD = i686-pc-serenity-g++ AR = i686-pc-serenity-ar all: $(APP) diff --git a/Servers/WindowServer/Makefile b/Servers/WindowServer/Makefile index 2e5cb42781..ed3b4ec4f1 100644 --- a/Servers/WindowServer/Makefile +++ b/Servers/WindowServer/Makefile @@ -36,7 +36,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld +LD = i686-pc-serenity-g++ AR = i686-pc-serenity-ar all: $(APP) diff --git a/Userland/Makefile b/Userland/Makefile index 3f6d43ff58..c79a319a94 100644 --- a/Userland/Makefile +++ b/Userland/Makefile @@ -86,7 +86,7 @@ APPS = \ ARCH_FLAGS = STANDARD_FLAGS = -std=c++17 WARNING_FLAGS = -Wextra -Wall -Wundef -Wcast-qual -Wwrite-strings -Wimplicit-fallthrough -FLAVOR_FLAGS = -fno-exceptions -fno-rtti +FLAVOR_FLAGS = -fno-exceptions -fno-rtti -fno-sized-deallocation OPTIMIZATION_FLAGS = -Os INCLUDE_FLAGS = -I.. -I. -I../LibC @@ -94,7 +94,7 @@ DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(ARCH_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) CXX = i686-pc-serenity-g++ -LD = i686-pc-serenity-ld +LD = i686-pc-serenity-g++ AR = i686-pc-serenity-r LDFLAGS = -L ../LibC