Initial commit

This commit is contained in:
2025-03-31 18:05:17 +02:00
commit 336ef95c3f
10 changed files with 197 additions and 0 deletions

27
.editorconfig Normal file
View File

@@ -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

26
.gitignore vendored Normal file
View File

@@ -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

23
README.md Normal file
View File

@@ -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)

11
haxcc.c Normal file
View File

@@ -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;
}

18
haxcc.h Normal file
View File

@@ -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

9
haxcc.ld Normal file
View File

@@ -0,0 +1,9 @@
SECTIONS
{
haxmods (READONLY) : ALIGN(4) {
PROVIDE(haxmods_begin = .);
KEEP(*(__haxmod))
PROVIDE(haxmods_end = .);
}
}
INSERT AFTER .text

24
hello.cpp Normal file
View File

@@ -0,0 +1,24 @@
#include <cstdio>
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;
}

23
meson.build Normal file
View File

@@ -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
)

18
mods/mod_a.c Normal file
View File

@@ -0,0 +1,18 @@
#include "haxcc.h"
#include <stdio.h>
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
};

18
mods/mod_b.c Normal file
View File

@@ -0,0 +1,18 @@
#include "haxcc.h"
#include <stdio.h>
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
};