liblinux++

A hosted C++ runtime without any libc.
git clone git://henryandlizzy.uk/liblinux++
Log | Files | Refs

commit a1233648a601a398356c9a3c3d9f63ed1a7a7e73
parent ecbed962c021579f1bdf8f010da7c9de7dae84f4
Author: Henry Wilson <henry@henryandlizzy.uk>
Date:   Thu,  8 Jan 2026 19:04:40 +0000

Move runtime support functions to cxa.cpp

Diffstat:
MTupfile | 20++++++++++++++------
Acxa.cpp | 18++++++++++++++++++
Mlinux.hpp | 17-----------------
3 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/Tupfile b/Tupfile @@ -1,15 +1,23 @@ CXXFLAGS = -std=c++23 -Werror -g -fno-exceptions -fno-rtti -fno-asynchronous-unwind-tables -fno-builtin -fno-pic -fno-pie -fno-stack-protector -fdiagnostics-color=always LDFLAGS = --gc-sections -: |> ./errno.sh > %o |> errno.hpp {pre-compile} +: |> ./errno.sh > %o |> errno.hpp -: foreach *.cpp | {pre-compile} |> ^j^ clang++ --target=aarch64 $(CXXFLAGS) -c -o %o %f |> obj/%B.aarch64.o {objs-aarch64} -: foreach *.cpp | {pre-compile} |> ^j^ clang++ --target=x86_64 $(CXXFLAGS) -c -o %o %f |> obj/%B.x86_64.o {objs-x86_64} +!cpp.aarch64 = | errno.hpp |> ^j^ clang++ --target=aarch64 $(CXXFLAGS) -c -o %o %f |> +!cpp.x86_64 = | errno.hpp |> ^j^ clang++ --target=x86_64 $(CXXFLAGS) -c -o %o %f |> -: foreach *.S |> clang --target=%B -c -o %o %f |> obj/%B.o +: foreach *.cpp ^cxa.cpp |> !cpp.aarch64 |> obj/%B.aarch64.o {objs-aarch64} +: foreach *.cpp ^cxa.cpp |> !cpp.x86_64 |> obj/%B.x86_64.o {objs-x86_64} +: cxa.cpp |> !cpp.aarch64 |> obj/%B.aarch64.o +: cxa.cpp |> !cpp.x86_64 |> obj/%B.x86_64.o -: foreach {objs-aarch64} | aarch64.ld obj/aarch64.o |> ld.lld -m aarch64elf $(LDFLAGS) -o %o --script aarch64.ld obj/aarch64.o %f |> bin/%B {bin-aarch64} -: foreach {objs-x86_64} | x86_64.ld obj/x86_64.o |> ld.lld -m elf_x86_64 $(LDFLAGS) -o %o --script x86_64.ld obj/x86_64.o %f |> bin/%B {bin-x86_64} +: foreach *.S |> clang --target=%B -c -o %o %f |> obj/%B.o + +!ld.aarch64 = | obj/cxa.aarch64.o obj/aarch64.o aarch64.ld |> ld.lld -m aarch64elf $(LDFLAGS) -o %o --script aarch64.ld %f obj/cxa.aarch64.o obj/aarch64.o |> +!ld.x86_64 = | obj/cxa.x86_64.o obj/x86_64.o x86_64.ld |> ld.lld -m elf_x86_64 $(LDFLAGS) -o %o --script x86_64.ld %f obj/cxa.x86_64.o obj/x86_64.o |> + +: foreach {objs-aarch64} |> !ld.aarch64 |> bin/%B {bin-aarch64} +: foreach {objs-x86_64} |> !ld.x86_64 |> bin/%B {bin-x86_64} run ./gen.sh diff --git a/cxa.cpp b/cxa.cpp @@ -0,0 +1,18 @@ +#include "linux.hpp" + +extern "C" +{ + +void memset(char* p, size_t n, char c) noexcept +{ + char* const end = p + n; + while (p != end) + *p++ = c; +} + +void __cxa_pure_virtual() noexcept +{ + __builtin_trap(); +} + +} diff --git a/linux.hpp b/linux.hpp @@ -223,20 +223,3 @@ extern syscall_result<void> bind(file socket, addr_ref addr); extern syscall_result<void> listen(file socket, int backlog); extern syscall_result<file> accept(file socket, void* addr_buf, socklen_t* addr_len); extern syscall_result<file> dup(file oldfd, file newfd, int flags = 0); - -extern "C" -{ - -void memset(char* p, size_t n, char c) -{ - char* const end = p + n; - while (p != end) - *p++ = c; -} - -void __cxa_pure_virtual() -{ - __builtin_trap(); -} - -}