Fix alignment issue
This commit is contained in:
7
haxcc.h
7
haxcc.h
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
10
mods/mod_a.c
10
mods/mod_a.c
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
10
mods/mod_b.c
10
mods/mod_b.c
@@ -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
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