From 77bdad9100365a0132c0a461449a7fc6c1c83f7a Mon Sep 17 00:00:00 2001 From: Princess-of-Sleeping <29831892+Princess-of-Sleeping@users.noreply.github.com> Date: Tue, 14 Nov 2023 20:50:37 +0900 Subject: [PATCH] Fixed module entry problem via default or config --- src/vita-elf-create/sce-elf.c | 19 +++++++++++++------ src/vita-elf-create/vita-elf-create.c | 17 +++++++++++++---- src/vita-export-parse.c | 5 ++++- src/vita-export.h | 1 + 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/vita-elf-create/sce-elf.c b/src/vita-elf-create/sce-elf.c index 5fcee46..18a4600 100644 --- a/src/vita-elf-create/sce-elf.c +++ b/src/vita-elf-create/sce-elf.c @@ -196,7 +196,10 @@ static int set_main_module_export(vita_elf_t *ve, sce_module_exports_t *export, export->num_syms_vars = 1; // module_info for default if (export_spec->is_image_module == 0) { - if (export_spec->start) + /* + * non export.yml module shoule be have main function. + */ + if (export_spec->start || export_spec->is_default != 0) ++export->num_syms_funcs; if (export_spec->bootstart) @@ -230,13 +233,17 @@ static int set_main_module_export(vita_elf_t *ve, sce_module_exports_t *export, } module_info->module_start = vita_elf_vaddr_to_host(ve, vaddr); - } else { + + export->nid_table[cur_nid] = NID_MODULE_START; + export->entry_table[cur_nid] = module_info->module_start; + ++cur_nid; + } else if(export_spec->is_default != 0) { module_info->module_start = vita_elf_vaddr_to_host(ve, elf32_getehdr(ve->elf)->e_entry); - } - export->nid_table[cur_nid] = NID_MODULE_START; - export->entry_table[cur_nid] = module_info->module_start; - ++cur_nid; + export->nid_table[cur_nid] = NID_MODULE_START; + export->entry_table[cur_nid] = module_info->module_start; + ++cur_nid; + } if (export_spec->bootstart) { Elf32_Addr vaddr = 0; diff --git a/src/vita-elf-create/vita-elf-create.c b/src/vita-elf-create/vita-elf-create.c index 0c152de..325a34c 100644 --- a/src/vita-elf-create/vita-elf-create.c +++ b/src/vita-elf-create/vita-elf-create.c @@ -35,10 +35,15 @@ void print_stubs(vita_elf_stub_t *stubs, int num_stubs) int i; for (i = 0; i < num_stubs; i++) { - TRACEF(VERBOSE, " 0x%06x (%s):\n", stubs[i].addr, stubs[i].symbol ? stubs[i].symbol->name : "unreferenced stub"); - TRACEF(VERBOSE, " Flags : %u\n", stubs[i].library ? stubs[i].library->flags : 0); - TRACEF(VERBOSE, " Library: %u (%s)\n", stubs[i].library_nid, stubs[i].library ? stubs[i].library->name : "not found"); - TRACEF(VERBOSE, " NID : %u (%s)\n", stubs[i].target_nid, stubs[i].target ? stubs[i].target->name : "not found"); + // TRACEF(VERBOSE, " 0x%08X (%s):\n", stubs[i].addr, stubs[i].symbol ? stubs[i].symbol->name : "unreferenced stub"); + // TRACEF(VERBOSE, " Flags : 0x%04X\n", stubs[i].library ? stubs[i].library->flags : 0); + TRACEF( + VERBOSE, + " stub=0x%08X library_nid=0x%08X (%s) target_nid=0x%08X (%s)\n", + stubs[i].addr, + stubs[i].library_nid, stubs[i].library ? stubs[i].library->name : "not found", + stubs[i].target_nid, stubs[i].target ? stubs[i].target->name : "not found" + ); } } @@ -501,6 +506,8 @@ int main(int argc, char *argv[]) exports = vita_exports_load(args.exports, args.input, 0); if (!exports) return EXIT_FAILURE; + + TRACEF(VERBOSE, "export config loaded from file\n"); } if ((ve = vita_elf_load(args.input, args.check_stub_count, exports)) == NULL) @@ -523,6 +530,8 @@ int main(int argc, char *argv[]) exports->exit = args.entrypoint_funcs[2]; if (args.exports_output) vita_elf_generate_exports(ve, exports); + + TRACEF(VERBOSE, "export config loaded from default\n"); } if (ve->fstubs_va.count) { diff --git a/src/vita-export-parse.c b/src/vita-export-parse.c index e9e98fa..04f789c 100644 --- a/src/vita-export-parse.c +++ b/src/vita-export-parse.c @@ -576,6 +576,7 @@ vita_export_t *read_module_exports(yaml_document *doc, uint32_t default_nid) { vita_export_t *export = malloc(sizeof(vita_export_t)); memset(export, 0, sizeof(vita_export_t)); + export->is_default = 0; // check lhs is a scalar if (!is_scalar(root->pairs[0]->lhs)) { @@ -644,7 +645,9 @@ vita_export_t *vita_exports_loads(FILE *text, const char *elf, int verbose) vita_export_t *vita_export_generate_default(const char *elf) { vita_export_t *exports = calloc(1, sizeof(vita_export_t)); - + + exports->is_default = 1; + // set module name to elf output name const char *fs = strrchr(elf, '/'); const char *bs = strrchr(elf, '\\'); diff --git a/src/vita-export.h b/src/vita-export.h index 132cc93..1e41d4a 100644 --- a/src/vita-export.h +++ b/src/vita-export.h @@ -23,6 +23,7 @@ typedef struct { } vita_library_export; typedef struct { + int is_default; char name[27]; uint8_t ver_major; uint8_t ver_minor;