From ba6e8e13499e78b69eee8b5dcc6736afa9732d65 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Tue, 13 Feb 2024 22:41:40 -0800 Subject: [PATCH] [libc] Pull crt0 out into its own module Sorta. crt0 is a separate module as far as bonnibel is concerned, but it's still part of the libc module file. --- assets/build/target.init.yaml | 5 +++++ assets/build/target.user.exe.yaml | 5 +++++ assets/build/target.user.yaml | 2 +- src/libraries/libc/arch/amd64/crt/crt0.s | 10 +++++++++- src/libraries/libc/arch/amd64/{crt => }/init.cpp | 0 src/libraries/libc/arch/amd64/{crt => }/libdl.cpp | 0 src/libraries/libc/libc.module | 10 ++++++++-- 7 files changed, 28 insertions(+), 4 deletions(-) rename src/libraries/libc/arch/amd64/{crt => }/init.cpp (100%) rename src/libraries/libc/arch/amd64/{crt => }/libdl.cpp (100%) diff --git a/assets/build/target.init.yaml b/assets/build/target.init.yaml index c76ae04..474661d 100644 --- a/assets/build/target.init.yaml +++ b/assets/build/target.init.yaml @@ -12,6 +12,8 @@ ccflags: [ "-U__linux", "-U__linux__", + "-DMSPACES", + "--sysroot='${source_root}/sysroot'" ] @@ -32,3 +34,6 @@ ldflags: [ "--no-dependent-libraries", ] +libs: [ + "${target_dir}/crt0.o", +] \ No newline at end of file diff --git a/assets/build/target.user.exe.yaml b/assets/build/target.user.exe.yaml index 0cffcd3..6397659 100644 --- a/assets/build/target.user.exe.yaml +++ b/assets/build/target.user.exe.yaml @@ -1,4 +1,5 @@ --- + ccflags: [ "-fpie" ] @@ -8,3 +9,7 @@ ldflags: [ "--dynamic-linker", "/jsix/lib/ld.so", "--push-state", "--as-needed", "-Bstatic", "-lc++", "-lc++abi", "-lunwind", "--pop-state", ] + +libs: [ + "${target_dir}/crt0.o", +] \ No newline at end of file diff --git a/assets/build/target.user.yaml b/assets/build/target.user.yaml index efb98ad..99dfb00 100644 --- a/assets/build/target.user.yaml +++ b/assets/build/target.user.yaml @@ -1,5 +1,5 @@ --- -asflags: [ "-I${source_root}/src/kernel/" ] +asflags: [] ccflags: [ "--target=x86_64-jsix-elf", diff --git a/src/libraries/libc/arch/amd64/crt/crt0.s b/src/libraries/libc/arch/amd64/crt/crt0.s index 076da03..e5a5414 100644 --- a/src/libraries/libc/arch/amd64/crt/crt0.s +++ b/src/libraries/libc/arch/amd64/crt/crt0.s @@ -1,10 +1,18 @@ -%include "util/got.inc" +extern _GLOBAL_OFFSET_TABLE_ extern main extern exit extern __init_libj6 extern __init_libc +; Put the address of the given symbol in rax +; This macro is the same as in util/got.inc, +; but crt0 can't have a dep on libutil +%macro lookup_GOT 1 + lea rax, [rel _GLOBAL_OFFSET_TABLE_] + mov rax, [rax + %1 wrt ..got] +%endmacro + global _start:function weak (_libc_crt0_start.end - _libc_crt0_start) global _libc_crt0_start:function (_libc_crt0_start.end - _libc_crt0_start) diff --git a/src/libraries/libc/arch/amd64/crt/init.cpp b/src/libraries/libc/arch/amd64/init.cpp similarity index 100% rename from src/libraries/libc/arch/amd64/crt/init.cpp rename to src/libraries/libc/arch/amd64/init.cpp diff --git a/src/libraries/libc/arch/amd64/crt/libdl.cpp b/src/libraries/libc/arch/amd64/libdl.cpp similarity index 100% rename from src/libraries/libc/arch/amd64/crt/libdl.cpp rename to src/libraries/libc/arch/amd64/libdl.cpp diff --git a/src/libraries/libc/libc.module b/src/libraries/libc/libc.module index d3829ba..6196c1b 100644 --- a/src/libraries/libc/libc.module +++ b/src/libraries/libc/libc.module @@ -18,7 +18,7 @@ def glob(ext, root=''): sources = [] for ext in ("c", "cpp", "s", "inc"): - sources += glob(ext) + glob(ext + ".cog") + sources += [f for f in glob(ext) + glob(ext + ".cog") if not "crt" in f] headers = [] for ext in ("h",): @@ -26,7 +26,7 @@ for ext in ("h",): libc = module("libc", kind = "lib", - deps = [ "j6" ], + deps = [ "j6", "crt0.o" ], basename = "libc", include_phase = "late", sources = sources, @@ -39,3 +39,9 @@ libc.variables["ccflags"] = [ "-DPRINTF_SUPPORT_DECIMAL_SPECIFIERS=0", "-DPRINTF_SUPPORT_EXPONENTIAL_SPECIFIERS=0", ] + +crt = module("crt0.o", + kind = "cp", + sources = [ + "arch/amd64/crt/crt0.s", + ])