mirror of
https://github.com/wiiu-env/WiiUModuleSystem.git
synced 2024-11-22 09:49:18 +01:00
Implement WUMS 0.2
This commit is contained in:
parent
f461fc4539
commit
c5af736523
@ -1,4 +1,4 @@
|
|||||||
FROM wiiuenv/devkitppc:20210414
|
FROM wiiuenv/devkitppc:20210917
|
||||||
|
|
||||||
WORKDIR build
|
WORKDIR build
|
||||||
COPY . .
|
COPY . .
|
||||||
|
4
Makefile
4
Makefile
@ -2,8 +2,8 @@ TOPDIR ?= $(CURDIR)
|
|||||||
include $(TOPDIR)/share/wums_rules
|
include $(TOPDIR)/share/wums_rules
|
||||||
|
|
||||||
export WUMS_MAJOR := 0
|
export WUMS_MAJOR := 0
|
||||||
export WUMS_MINOR := 1
|
export WUMS_MINOR := 2
|
||||||
export WUMS_PATCH := 3
|
export WUMS_PATCH := 0
|
||||||
|
|
||||||
VERSION := $(WUMS_MAJOR).$(WUMS_MINOR).$(WUMS_PATCH)
|
VERSION := $(WUMS_MAJOR).$(WUMS_MINOR).$(WUMS_PATCH)
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
#ifndef WUMS_H_
|
#pragma once
|
||||||
#define WUMS_H_
|
|
||||||
|
|
||||||
|
#include "wums/meta.h"
|
||||||
#include "wums/common.h"
|
#include "wums/common.h"
|
||||||
#include "wums/exports.h"
|
#include "wums/exports.h"
|
||||||
#include "wums/hooks.h"
|
#include "wums/hooks.h"
|
||||||
|
|
||||||
#endif /* WUMS_H_ */
|
|
@ -2,7 +2,7 @@
|
|||||||
* by Alex Chadwick
|
* by Alex Chadwick
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014, Alex Chadwick
|
* Copyright (C) 2014, Alex Chadwick
|
||||||
* Modified by Maschell, 2018-2020
|
* Modified by Maschell, 2018-2021
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -23,18 +23,9 @@
|
|||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WUMS_COMMON_DEF_H_
|
#pragma once
|
||||||
#define WUMS_COMMON_DEF_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "defines/module_defines.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -46,17 +37,6 @@ extern "C" {
|
|||||||
extern const char wums_meta_ ## id [] WUMS_SECTION("meta"); \
|
extern const char wums_meta_ ## id [] WUMS_SECTION("meta"); \
|
||||||
const char wums_meta_ ## id [] = #id "=" value
|
const char wums_meta_ ## id [] = #id "=" value
|
||||||
|
|
||||||
#define WUMS_MODULE_EXPORT_NAME(x) WUMS_META(export_name, x); WUMS_META(wum, "0.1"); WUMS_META(buildtimestamp, __DATE__ " " __TIME__)
|
|
||||||
#define WUMS_MODULE_AUTHOR(x) WUMS_META(author, x)
|
|
||||||
#define WUMS_MODULE_VERSION(x) WUMS_META(version, x)
|
|
||||||
#define WUMS_MODULE_LICENSE(x) WUMS_META(license, x)
|
|
||||||
#define WUMS_MODULE_DESCRIPTION(x) WUMS_META(description, x)
|
|
||||||
#define WUMS_MODULE_SKIP_ENTRYPOINT() WUMS_META(skipEntrypoint, "true")
|
|
||||||
#define WUMS_MODULE_INIT_BEFORE_RELOCATION_DONE_HOOK() WUMS_META(initBeforeRelocationDoneHook, "true")
|
|
||||||
#define WUMS_MODULE_SKIP_WUT_INIT() WUMS_META(skipwutInit, "true")
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* WUMS_COMMON_DEF_H_ */
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
@ -39,13 +40,13 @@ typedef struct _dyn_linking_function_t {
|
|||||||
|
|
||||||
typedef struct _dyn_linking_import_t {
|
typedef struct _dyn_linking_import_t {
|
||||||
char importName[DYN_LINK_IMPORT_NAME_LENGTH + 1];
|
char importName[DYN_LINK_IMPORT_NAME_LENGTH + 1];
|
||||||
bool isData = false;
|
bool isData;
|
||||||
} dyn_linking_import_t;
|
} dyn_linking_import_t;
|
||||||
|
|
||||||
typedef struct _dyn_linking_relocation_entry_t {
|
typedef struct _dyn_linking_relocation_entry_t {
|
||||||
dyn_linking_function_t *functionEntry = NULL;
|
dyn_linking_function_t *functionEntry;
|
||||||
dyn_linking_import_t *importEntry = NULL;
|
dyn_linking_import_t *importEntry;
|
||||||
void *destination = NULL;
|
void *destination;
|
||||||
char type;
|
char type;
|
||||||
size_t offset;
|
size_t offset;
|
||||||
int32_t addend;
|
int32_t addend;
|
||||||
|
@ -6,5 +6,5 @@
|
|||||||
typedef struct export_data_t {
|
typedef struct export_data_t {
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
char name[EXPORT_MAXIMUM_NAME_LENGTH];
|
char name[EXPORT_MAXIMUM_NAME_LENGTH];
|
||||||
uint32_t address = 0;
|
uint32_t address;
|
||||||
} export_data_t;
|
} export_data_t;
|
@ -32,15 +32,15 @@ extern "C" {
|
|||||||
|
|
||||||
#define DYN_LINK_RELOCATION_LIST_LENGTH 500
|
#define DYN_LINK_RELOCATION_LIST_LENGTH 500
|
||||||
#define EXPORT_ENTRY_LIST_LENGTH 100
|
#define EXPORT_ENTRY_LIST_LENGTH 100
|
||||||
#define HOOK_ENTRY_LIST_LENGTH 10
|
#define HOOK_ENTRY_LIST_LENGTH 20
|
||||||
|
|
||||||
typedef struct hook_data_t {
|
typedef struct hook_data_t {
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
uint32_t target = 0;
|
uint32_t target;
|
||||||
} hook_data_t;
|
} hook_data_t;
|
||||||
|
|
||||||
struct module_information_single_t {
|
typedef struct module_information_single_t {
|
||||||
char path[MAXIMUM_MODULE_PATH_NAME_LENGTH] = ""; // Path where the module is stored
|
char path[MAXIMUM_MODULE_PATH_NAME_LENGTH]; // Path where the module is stored
|
||||||
dyn_linking_relocation_entry_t linking_entries[DYN_LINK_RELOCATION_LIST_LENGTH];
|
dyn_linking_relocation_entry_t linking_entries[DYN_LINK_RELOCATION_LIST_LENGTH];
|
||||||
char module_export_name[MAXIMUM_EXPORT_MODULE_NAME_LENGTH];
|
char module_export_name[MAXIMUM_EXPORT_MODULE_NAME_LENGTH];
|
||||||
export_data_t export_entries[EXPORT_ENTRY_LIST_LENGTH];
|
export_data_t export_entries[EXPORT_ENTRY_LIST_LENGTH];
|
||||||
@ -55,19 +55,18 @@ struct module_information_single_t {
|
|||||||
uint32_t endAddress;
|
uint32_t endAddress;
|
||||||
uint8_t skipEntrypoint;
|
uint8_t skipEntrypoint;
|
||||||
uint8_t initBeforeRelocationDoneHook;
|
uint8_t initBeforeRelocationDoneHook;
|
||||||
uint8_t skipWUTInit;
|
} module_information_single_t;
|
||||||
};
|
|
||||||
|
|
||||||
#define MAXIMUM_MODULES 8
|
#define MAXIMUM_MODULES 8
|
||||||
#define MODULE_INFORMATION_VERSION 0x00000003
|
#define MODULE_INFORMATION_VERSION 0x00000004
|
||||||
|
|
||||||
struct module_information_t {
|
typedef struct module_information_t {
|
||||||
uint32_t version = MODULE_INFORMATION_VERSION;
|
uint32_t version;
|
||||||
int32_t number_used_modules = 0; // Number of used function. Maximum is MAXIMUM_MODULES
|
int32_t number_used_modules; // Number of used function. Maximum is MAXIMUM_MODULES
|
||||||
dyn_linking_relocation_data_t linking_data;
|
dyn_linking_relocation_data_t linking_data;
|
||||||
relocation_trampolin_entry_t trampolines[DYN_LINK_TRAMPOLIN_LIST_LENGTH];
|
relocation_trampolin_entry_t trampolines[DYN_LINK_TRAMPOLIN_LIST_LENGTH];
|
||||||
module_information_single_t module_data[MAXIMUM_MODULES];
|
module_information_single_t module_data[MAXIMUM_MODULES];
|
||||||
};
|
} module_information_t;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -16,5 +16,5 @@ typedef enum RelocationType{
|
|||||||
typedef struct relocation_trampolin_entry_t {
|
typedef struct relocation_trampolin_entry_t {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t trampolin[4];
|
uint32_t trampolin[4];
|
||||||
RelocationTrampolinStatus status = RELOC_TRAMP_FREE;
|
RelocationTrampolinStatus status;
|
||||||
} relocation_trampolin_entry_t;
|
} relocation_trampolin_entry_t;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* by Alex Chadwick
|
* by Alex Chadwick
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014, Alex Chadwick
|
* Copyright (C) 2014, Alex Chadwick
|
||||||
* Modified by Maschell, 2018-2020
|
* Modified by Maschell, 2018-2021
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -23,8 +23,7 @@
|
|||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WUMS_FUNCTION_EXPORT_DEF_H_
|
#pragma once
|
||||||
#define WUMS_FUNCTION_EXPORT_DEF_H_
|
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
@ -55,9 +54,6 @@ typedef struct wums_entry_t {
|
|||||||
.address = (const void*) value \
|
.address = (const void*) value \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* WUMS_FUNCTION_EXPORT_DEF_H_ */
|
|
@ -2,7 +2,7 @@
|
|||||||
* by Alex Chadwick
|
* by Alex Chadwick
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014, Alex Chadwick
|
* Copyright (C) 2014, Alex Chadwick
|
||||||
* Modified by Maschell, 2018-2020
|
* Modified by Maschell, 2018-2021
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -40,11 +40,20 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef enum wums_hook_type_t {
|
typedef enum wums_hook_type_t {
|
||||||
|
WUMS_HOOK_INIT_WUT_MALLOC,
|
||||||
|
WUMS_HOOK_FINI_WUT_MALLOC,
|
||||||
|
WUMS_HOOK_INIT_WUT_NEWLIB,
|
||||||
|
WUMS_HOOK_FINI_WUT_NEWLIB,
|
||||||
|
WUMS_HOOK_INIT_WUT_STDCPP,
|
||||||
|
WUMS_HOOK_FINI_WUT_STDCPP,
|
||||||
|
WUMS_HOOK_INIT_WUT_DEVOPTAB,
|
||||||
|
WUMS_HOOK_FINI_WUT_DEVOPTAB,
|
||||||
|
WUMS_HOOK_INIT_WUT_SOCKETS,
|
||||||
|
WUMS_HOOK_FINI_WUT_SOCKETS,
|
||||||
|
|
||||||
WUMS_HOOK_INIT,
|
WUMS_HOOK_INIT,
|
||||||
WUMS_HOOK_APPLICATION_STARTS,
|
WUMS_HOOK_APPLICATION_STARTS,
|
||||||
WUMS_HOOK_APPLICATION_ENDS,
|
WUMS_HOOK_APPLICATION_ENDS,
|
||||||
WUMS_HOOK_INIT_WUT,
|
|
||||||
WUMS_HOOK_FINI_WUT,
|
|
||||||
WUMS_HOOK_RELOCATIONS_DONE,
|
WUMS_HOOK_RELOCATIONS_DONE,
|
||||||
WUMS_HOOK_APPLICATION_REQUESTS_EXIT,
|
WUMS_HOOK_APPLICATION_REQUESTS_EXIT,
|
||||||
} wums_hook_type_t;
|
} wums_hook_type_t;
|
||||||
@ -63,8 +72,6 @@ typedef struct wums_relocs_done_args_t {
|
|||||||
} wums_relocs_done_args_t;
|
} wums_relocs_done_args_t;
|
||||||
|
|
||||||
#define WUMS_INITIALIZE(myargs) \
|
#define WUMS_INITIALIZE(myargs) \
|
||||||
WUMS_INIT_WUT(); \
|
|
||||||
WUMS_FINI_WUT(); \
|
|
||||||
void __wums__init(wums_app_init_args_t);\
|
void __wums__init(wums_app_init_args_t);\
|
||||||
WUMS_HOOK_EX(WUMS_HOOK_INIT, __wums__init); \
|
WUMS_HOOK_EX(WUMS_HOOK_INIT, __wums__init); \
|
||||||
void __wums__init(wums_app_init_args_t myargs)
|
void __wums__init(wums_app_init_args_t myargs)
|
||||||
@ -88,43 +95,67 @@ typedef struct wums_relocs_done_args_t {
|
|||||||
void __wums_relocations_done(wums_relocs_done_args_t);\
|
void __wums_relocations_done(wums_relocs_done_args_t);\
|
||||||
WUMS_HOOK_EX(WUMS_HOOK_RELOCATIONS_DONE, __wums_relocations_done); \
|
WUMS_HOOK_EX(WUMS_HOOK_RELOCATIONS_DONE, __wums_relocations_done); \
|
||||||
void __wums_relocations_done(wums_relocs_done_args_t myargs)
|
void __wums_relocations_done(wums_relocs_done_args_t myargs)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define WUMS_INIT_WUT() \
|
|
||||||
void __wums_init_wut(void);\
|
|
||||||
extern "C" void __init_wut(void);\
|
|
||||||
void __wums_init_wut(){ \
|
|
||||||
__init_wut(); \
|
|
||||||
} \
|
|
||||||
WUMS_HOOK_EX(WUMS_HOOK_INIT_WUT, __wums_init_wut)
|
|
||||||
#else
|
|
||||||
#define WUMS_INIT_WUT() \
|
|
||||||
void __wums_init_wut(void);\
|
|
||||||
extern void __init_wut(void);\
|
|
||||||
void __wums_init_wut(){ \
|
|
||||||
__init_wut(); \
|
|
||||||
} \
|
|
||||||
WUMS_HOOK_EX(WUMS_HOOK_INIT_WUT, __wums_init_wut)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#define WUMS_FINI_WUT() \
|
#define __EXTERN_C_MACRO extern "C"
|
||||||
void __wums_fini_wut(void);\
|
|
||||||
extern "C" void __fini_wut(void);\
|
|
||||||
void __wums_fini_wut(){ \
|
|
||||||
__fini_wut(); \
|
|
||||||
} \
|
|
||||||
WUMS_HOOK_EX(WUMS_HOOK_FINI_WUT, __wums_fini_wut)
|
|
||||||
#else
|
#else
|
||||||
#define WUMS_FINI_WUT() \
|
#define __EXTERN_C_MACRO
|
||||||
void __wums_fini_wut(void);\
|
|
||||||
extern void __fini_wut(void);\
|
|
||||||
void __wums_fini_wut(){ \
|
|
||||||
__fini_wut(); \
|
|
||||||
} \
|
|
||||||
WUMS_HOOK_EX(WUMS_HOOK_FINI_WUT, __wums_fini_wut)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define WUMS_USE_WUT_MALLOC() \
|
||||||
|
__EXTERN_C_MACRO void __init_wut_malloc(); \
|
||||||
|
void on_init_wut_malloc(){ \
|
||||||
|
__init_wut_malloc(); \
|
||||||
|
}\
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_INIT_WUT_MALLOC,on_init_wut_malloc); \
|
||||||
|
__EXTERN_C_MACRO void __fini_wut_malloc(); \
|
||||||
|
void on_fini_wut_malloc(){ \
|
||||||
|
__fini_wut_malloc(); \
|
||||||
|
} \
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_FINI_WUT_MALLOC,on_fini_wut_malloc); \
|
||||||
|
|
||||||
|
#define WUMS_USE_WUT_DEVOPTAB() \
|
||||||
|
__EXTERN_C_MACRO void __init_wut_devoptab(); \
|
||||||
|
void on_init_wut_devoptab(){ \
|
||||||
|
__init_wut_devoptab(); \
|
||||||
|
}\
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_INIT_WUT_DEVOPTAB,on_init_wut_devoptab); \
|
||||||
|
__EXTERN_C_MACRO void __fini_wut_devoptab(); \
|
||||||
|
void on_fini_wut_devoptab(){ \
|
||||||
|
__fini_wut_devoptab(); \
|
||||||
|
}\
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_FINI_WUT_DEVOPTAB,on_fini_wut_devoptab);
|
||||||
|
|
||||||
|
#define WUMS_USE_WUT_NEWLIB() \
|
||||||
|
__EXTERN_C_MACRO void __init_wut_newlib(); \
|
||||||
|
void on_init_wut_newlib(){ \
|
||||||
|
__init_wut_newlib(); \
|
||||||
|
}\
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_INIT_WUT_NEWLIB,on_init_wut_newlib); \
|
||||||
|
__EXTERN_C_MACRO void __fini_wut_newlib(); \
|
||||||
|
void on_fini_wut_newlib(){ \
|
||||||
|
__fini_wut_newlib(); \
|
||||||
|
}\
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_FINI_WUT_NEWLIB,on_fini_wut_newlib);
|
||||||
|
|
||||||
|
#define WUMS_USE_WUT_STDCPP() \
|
||||||
|
__EXTERN_C_MACRO void __init_wut_stdcpp(); \
|
||||||
|
void on_init_wut_stdcpp(){ \
|
||||||
|
__init_wut_stdcpp(); \
|
||||||
|
}\
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_INIT_WUT_STDCPP,on_init_wut_stdcpp); \
|
||||||
|
__EXTERN_C_MACRO void __fini_wut_stdcpp(); \
|
||||||
|
void on_fini_wut_stdcpp(){ \
|
||||||
|
__fini_wut_stdcpp(); \
|
||||||
|
}\
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_FINI_WUT_STDCPP,on_fini_wut_stdcpp);
|
||||||
|
|
||||||
|
#define WUMS_USE_WUT_SOCKETS() \
|
||||||
|
__EXTERN_C_MACRO void __init_wut_socket(); \
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_INIT_WUT_SOCKETS,__init_wut_socket); \
|
||||||
|
__EXTERN_C_MACRO void __fini_wut_socket(); \
|
||||||
|
WUMS_HOOK_EX(WUMS_HOOK_FINI_WUT_SOCKETS,__fini_wut_socket);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
45
include/wums/meta.h
Normal file
45
include/wums/meta.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/* based on blsug.h
|
||||||
|
* by Alex Chadwick
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014, Alex Chadwick
|
||||||
|
* Modified by Maschell, 2018-2021
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "hooks.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define WUMS_MODULE_EXPORT_NAME(x) WUMS_META(export_name, x); WUMS_META(wum, "0.2"); WUMS_USE_WUT_MALLOC() WUMS_USE_WUT_SOCKETS() WUMS_USE_WUT_NEWLIB() WUMS_USE_WUT_STDCPP() WUMS_META(buildtimestamp, __DATE__ " " __TIME__);
|
||||||
|
#define WUMS_MODULE_AUTHOR(x) WUMS_META(author, x)
|
||||||
|
#define WUMS_MODULE_VERSION(x) WUMS_META(version, x)
|
||||||
|
#define WUMS_MODULE_LICENSE(x) WUMS_META(license, x)
|
||||||
|
#define WUMS_MODULE_DESCRIPTION(x) WUMS_META(description, x)
|
||||||
|
#define WUMS_MODULE_SKIP_ENTRYPOINT() WUMS_META(skipEntrypoint, "true")
|
||||||
|
#define WUMS_MODULE_INIT_BEFORE_RELOCATION_DONE_HOOK() WUMS_META(initBeforeRelocationDoneHook, "true")
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
@ -1,3 +1,27 @@
|
|||||||
int main(int argc, char** argv){
|
int main(int argc, char **argv) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern __attribute__((weak)) void __wut_socket_init_devoptab();
|
||||||
|
extern __attribute__((weak)) void __wut_socket_fini_devoptab();
|
||||||
|
|
||||||
|
static int __wut_socket_devoptab_added = 0;
|
||||||
|
|
||||||
|
extern void socket_lib_init();
|
||||||
|
|
||||||
|
void __attribute__((weak)) __init_wut_socket() {
|
||||||
|
if(!&__wut_socket_init_devoptab) return;
|
||||||
|
if (!__wut_socket_devoptab_added) {
|
||||||
|
socket_lib_init();
|
||||||
|
__wut_socket_init_devoptab();
|
||||||
|
__wut_socket_devoptab_added = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __attribute__((weak)) __fini_wut_socket() {
|
||||||
|
if(!&__wut_socket_init_devoptab || !&__wut_socket_fini_devoptab) return;
|
||||||
|
if (__wut_socket_devoptab_added) {
|
||||||
|
__wut_socket_fini_devoptab();
|
||||||
|
__wut_socket_devoptab_added = 0;
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,24 +1,7 @@
|
|||||||
.extern main
|
.extern main
|
||||||
.extern exit
|
|
||||||
.extern __init_wut
|
.section .crt0, "ax", @progbits
|
||||||
.extern __fini_wut
|
|
||||||
|
|
||||||
.global __wums_start
|
.global __wums_start
|
||||||
__wums_start:
|
__wums_start:
|
||||||
stwu 1, -0x28(1)
|
b main
|
||||||
mflr 0
|
|
||||||
stw 0, 0x2C(1)
|
|
||||||
stw 31, 0x24(1)
|
|
||||||
or 31, 1, 1
|
|
||||||
stw 3, 0x18(31)
|
|
||||||
stw 4, 0x1C(31)
|
|
||||||
bl __init_wut
|
|
||||||
lwz 4, 0x1C(31)
|
|
||||||
lwz 3, 0x18(31)
|
|
||||||
bl main
|
|
||||||
addi 11, 31, 0x28
|
|
||||||
lwz 0, 0x4(11)
|
|
||||||
mtlr 0
|
|
||||||
lwz 31, -0x4(11)
|
|
||||||
or 1, 11, 11
|
|
||||||
blr
|
|
Loading…
Reference in New Issue
Block a user