commit 336ef95c3faa74ffc01eb09d95a99085935c302f Author: Pratchaya Khansomboon Date: Mon Mar 31 18:05:17 2025 +0200 Initial commit 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 +};