From 336ef95c3faa74ffc01eb09d95a99085935c302f Mon Sep 17 00:00:00 2001 From: Pratchaya Khansomboon Date: Mon, 31 Mar 2025 18:05:17 +0200 Subject: [PATCH] Initial commit --- .editorconfig | 27 +++++++++++++++++++++++++++ .gitignore | 26 ++++++++++++++++++++++++++ README.md | 23 +++++++++++++++++++++++ haxcc.c | 11 +++++++++++ haxcc.h | 18 ++++++++++++++++++ haxcc.ld | 9 +++++++++ hello.cpp | 24 ++++++++++++++++++++++++ meson.build | 23 +++++++++++++++++++++++ mods/mod_a.c | 18 ++++++++++++++++++ mods/mod_b.c | 18 ++++++++++++++++++ 10 files changed, 197 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 README.md create mode 100644 haxcc.c create mode 100644 haxcc.h create mode 100644 haxcc.ld create mode 100644 hello.cpp create mode 100644 meson.build create mode 100644 mods/mod_a.c create mode 100644 mods/mod_b.c diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..02fbb92 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,27 @@ +[*] +end_of_line = LF +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{ts,js,tsx,jsx,lua,sh}] +charset = utf-8 +indent_style = space +indent_size = 2 + +[*.{go,bb}] +indent_style = tab + +[Makefile] +indent_style = tab + +[*.{yml,json}] +indent_style = space +indent_size = 2 + +[meson.{build,options}] +indent_style = space +indent_size = 2 + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..638da72 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# CMake/Meson +build* +cmake-build-* + +# IntelliJ +.idea + +# LSPs +.ccls +.ccls-cache +.cache +compile_commands.json + +# JetBrains Fleet +.fleet + +# macOS +.DS_Store +.AppleDouble +.LSOverride + +# Visual Studio Code +.vscode + +# ImGui +imgui.ini diff --git a/README.md b/README.md new file mode 100644 index 0000000..76a94eb --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# Hello Linker Script! + +Trying out linker script. + +## Requirement + + - [meson](https://mesonbuild.com/) + +## Development + +```sh +meson setup build +``` + +```sh +ninja -C build +``` + +## Resources + + - [Mastering the GNU linker script](https://allthingsembedded.com/post/2020-04-11-mastering-the-gnu-linker-script/) + - [Linker Scripts](https://home.cs.colorado.edu/~main/cs1300/doc/gnu/ld_3.html) + diff --git a/haxcc.c b/haxcc.c new file mode 100644 index 0000000..430b52e --- /dev/null +++ b/haxcc.c @@ -0,0 +1,11 @@ +#include "haxcc.h" + +extern mod haxmods_begin[]; +extern mod haxmods_end[]; + +mod* mod_begin(void) { + return haxmods_begin; +} +mod* mod_end(void) { + return haxmods_end; +} diff --git a/haxcc.h b/haxcc.h new file mode 100644 index 0000000..c83f326 --- /dev/null +++ b/haxcc.h @@ -0,0 +1,18 @@ +#ifndef HAXCC_H +#define HAXCC_H + +#define HAX_MOD(name) \ + static const struct mod name __attribute__((used, section("__haxmod"))) + +typedef int (*init_fn)(void); +typedef int (*done_fn)(void); + +typedef struct mod { + init_fn init; + done_fn done; +} mod; + +mod* mod_begin(void); +mod* mod_end(void); + +#endif // HAXCC_H diff --git a/haxcc.ld b/haxcc.ld new file mode 100644 index 0000000..0c9c443 --- /dev/null +++ b/haxcc.ld @@ -0,0 +1,9 @@ +SECTIONS +{ + haxmods (READONLY) : ALIGN(4) { + PROVIDE(haxmods_begin = .); + KEEP(*(__haxmod)) + PROVIDE(haxmods_end = .); + } +} +INSERT AFTER .text diff --git a/hello.cpp b/hello.cpp new file mode 100644 index 0000000..b23bb70 --- /dev/null +++ b/hello.cpp @@ -0,0 +1,24 @@ +#include + +extern "C" { +#include "haxcc.h" +} + +auto main() -> int { + std::printf("Hello, World!\n"); + std::printf("begin: %p, end: %p, len: %lu\n", (void*)mod_begin(), (void*)mod_end(), ((long)mod_end() - (long)mod_begin()) / sizeof(mod)); + std::printf("\n"); + + for (auto* it = mod_begin(); it != mod_end(); ++it) { + it->init(); + } + + std::printf("\n"); + std::printf("we're have init everything\n"); + std::printf("\n"); + + for (auto* it = mod_begin(); it != mod_end(); ++it) { + it->done(); + } + return 0; +} diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..5ed82ed --- /dev/null +++ b/meson.build @@ -0,0 +1,23 @@ +project( + 'haxcc', + ['c', 'cpp'], + version : '0.1', + default_options : [ + 'warning_level=3', + 'c_std=c2x', + 'cpp_std=c++23' + ]) + +ldscript = 'haxcc.ld' + +executable( + 'haxcc', + [ + 'hello.cpp', + 'haxcc.c', + 'mods/mod_a.c', + 'mods/mod_b.c', + ], + link_args: ['-Wl,-T', meson.source_root() / ldscript, '-no-pie' ], + install : false +) diff --git a/mods/mod_a.c b/mods/mod_a.c new file mode 100644 index 0000000..4d7de65 --- /dev/null +++ b/mods/mod_a.c @@ -0,0 +1,18 @@ +#include "haxcc.h" + +#include + +int mod_a_init(void) { + printf("module a init\n"); + return 0; +} + +int mod_a_done(void) { + printf("module a done\n"); + return 0; +} + +HAX_MOD(mod_a) = { + .init = mod_a_init, + .done = mod_a_done +}; diff --git a/mods/mod_b.c b/mods/mod_b.c new file mode 100644 index 0000000..16b3493 --- /dev/null +++ b/mods/mod_b.c @@ -0,0 +1,18 @@ +#include "haxcc.h" + +#include + +static int mod_b_init(void) { + printf("top kek MODB!\n"); + return 0; +} + +static int mod_b_done(void) { + printf("MODB do be done!\n"); + return 0; +} + +HAX_MOD(mod_b) = { + .init = mod_b_init, + .done = mod_b_done +};