Fix alignment issue

This commit is contained in:
2025-03-31 18:43:36 +02:00
parent 336ef95c3f
commit 389eecfd73
6 changed files with 42 additions and 11 deletions

View File

@@ -1,17 +1,20 @@
#ifndef HAXCC_H #ifndef HAXCC_H
#define 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 (*init_fn)(void);
typedef int (*done_fn)(void); typedef int (*done_fn)(void);
typedef struct mod { typedef struct mod {
char const* name;
int priority;
init_fn init; init_fn init;
done_fn done; done_fn done;
} mod; } mod;
#define HAX_MOD(name) \
static const struct mod name __attribute__((used, section("__haxmod"), aligned(__alignof__(struct mod))))
mod* mod_begin(void); mod* mod_begin(void);
mod* mod_end(void); mod* mod_end(void);

View File

@@ -9,7 +9,9 @@ auto main() -> int {
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("begin: %p, end: %p, len: %lu\n", (void*)mod_begin(), (void*)mod_end(), ((long)mod_end() - (long)mod_begin()) / sizeof(mod));
std::printf("\n"); std::printf("\n");
for (auto* it = mod_begin(); it != mod_end(); ++it) { for (auto* it = mod_begin(); it < mod_end(); ++it) {
// std::printf("%lu: %lu\n", sizeof(mod), (long)it - (long)mod_begin());
std::printf("%s [%d]: ", it->name, it->priority);
it->init(); it->init();
} }
@@ -18,6 +20,7 @@ auto main() -> int {
std::printf("\n"); std::printf("\n");
for (auto* it = mod_begin(); it != mod_end(); ++it) { for (auto* it = mod_begin(); it != mod_end(); ++it) {
std::printf("%s [%d]: ", it->name, it->priority);
it->done(); it->done();
} }
return 0; return 0;

View File

@@ -17,6 +17,7 @@ executable(
'haxcc.c', 'haxcc.c',
'mods/mod_a.c', 'mods/mod_a.c',
'mods/mod_b.c', 'mods/mod_b.c',
'mods/mod_c.c',
], ],
link_args: ['-Wl,-T', meson.source_root() / ldscript, '-no-pie' ], link_args: ['-Wl,-T', meson.source_root() / ldscript, '-no-pie' ],
install : false install : false

View File

@@ -2,17 +2,19 @@
#include <stdio.h> #include <stdio.h>
int mod_a_init(void) { static int init(void) {
printf("module a init\n"); printf("module a init\n");
return 0; return 0;
} }
int mod_a_done(void) { static int done(void) {
printf("module a done\n"); printf("module a done\n");
return 0; return 0;
} }
HAX_MOD(mod_a) = { HAX_MOD(mod_a) = {
.init = mod_a_init, .name = "a",
.done = mod_a_done .priority = 0,
.init = init,
.done = done
}; };

View File

@@ -2,17 +2,19 @@
#include <stdio.h> #include <stdio.h>
static int mod_b_init(void) { static int init(void) {
printf("top kek MODB!\n"); printf("top kek MODB!\n");
return 0; return 0;
} }
static int mod_b_done(void) { static int done(void) {
printf("MODB do be done!\n"); printf("MODB do be done!\n");
return 0; return 0;
} }
HAX_MOD(mod_b) = { HAX_MOD(mod_b) = {
.init = mod_b_init, .name = "b",
.done = mod_b_done .priority = 3,
.init = init,
.done = done
}; };

20
mods/mod_c.c Normal file
View File

@@ -0,0 +1,20 @@
#include "haxcc.h"
#include <stdio.h>
static int init(void) {
printf("top kek!\n");
return 0;
}
static int done(void) {
printf("meow !\n");
return 0;
}
HAX_MOD(mod_c) = {
.name = "c",
.priority = 2,
.init = init,
.done = done
};