Fix alignment issue
This commit is contained in:
7
haxcc.h
7
haxcc.h
@@ -1,17 +1,20 @@
|
||||
#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 {
|
||||
char const* name;
|
||||
int priority;
|
||||
init_fn init;
|
||||
done_fn done;
|
||||
} mod;
|
||||
|
||||
#define HAX_MOD(name) \
|
||||
static const struct mod name __attribute__((used, section("__haxmod"), aligned(__alignof__(struct mod))))
|
||||
|
||||
mod* mod_begin(void);
|
||||
mod* mod_end(void);
|
||||
|
||||
|
||||
@@ -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("\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();
|
||||
}
|
||||
|
||||
@@ -18,6 +20,7 @@ auto main() -> int {
|
||||
std::printf("\n");
|
||||
|
||||
for (auto* it = mod_begin(); it != mod_end(); ++it) {
|
||||
std::printf("%s [%d]: ", it->name, it->priority);
|
||||
it->done();
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -17,6 +17,7 @@ executable(
|
||||
'haxcc.c',
|
||||
'mods/mod_a.c',
|
||||
'mods/mod_b.c',
|
||||
'mods/mod_c.c',
|
||||
],
|
||||
link_args: ['-Wl,-T', meson.source_root() / ldscript, '-no-pie' ],
|
||||
install : false
|
||||
|
||||
10
mods/mod_a.c
10
mods/mod_a.c
@@ -2,17 +2,19 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int mod_a_init(void) {
|
||||
static int init(void) {
|
||||
printf("module a init\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mod_a_done(void) {
|
||||
static int done(void) {
|
||||
printf("module a done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
HAX_MOD(mod_a) = {
|
||||
.init = mod_a_init,
|
||||
.done = mod_a_done
|
||||
.name = "a",
|
||||
.priority = 0,
|
||||
.init = init,
|
||||
.done = done
|
||||
};
|
||||
|
||||
10
mods/mod_b.c
10
mods/mod_b.c
@@ -2,17 +2,19 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
static int mod_b_init(void) {
|
||||
static int init(void) {
|
||||
printf("top kek MODB!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mod_b_done(void) {
|
||||
static int done(void) {
|
||||
printf("MODB do be done!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
HAX_MOD(mod_b) = {
|
||||
.init = mod_b_init,
|
||||
.done = mod_b_done
|
||||
.name = "b",
|
||||
.priority = 3,
|
||||
.init = init,
|
||||
.done = done
|
||||
};
|
||||
|
||||
20
mods/mod_c.c
Normal file
20
mods/mod_c.c
Normal 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
|
||||
};
|
||||
Reference in New Issue
Block a user