//-------------------------------------------------------------------------- static void load_dl_header(linput_t *li) { if ( first_text_subspace_fpos == -1 ) return; qlseek(li, first_text_subspace_fpos); dl_header dl; lread(li, &dl, sizeof(dl)); dl.swap(); switch ( dl.hdr_version ) { case OLD_HDR_VERSION: break; case HDR_VERSION : break; default: msg("Unknown DL header version, skipping...\n"); } if ( dl.string_table_size != 0 ) { dl_ssize = dl.string_table_size; dl_strings = (char *)qalloc(dl_ssize); if ( dl_strings == NULL ) nomem("dl_strings"); qlseek(li, first_text_subspace_fpos+dl.string_table_loc); lread(li, dl_strings, dl_ssize); } if ( dl.dreloc_count ) complain_fixup(); load_imports(li, dl); load_exports(li, dl); qfree(dl_strings); dl_strings = NULL; }
static bool load_preset(const char *path) { unsigned i; if (!load_stock()) return false; RARCH_LOG("Loading Cg meta-shader: %s\n", path); config_file_t *conf = config_file_new(path); if (!conf) { RARCH_ERR("Failed to load preset.\n"); return false; } if (!cg_shader) cg_shader = (struct gfx_shader*)calloc(1, sizeof(*cg_shader)); if (!cg_shader) return false; if (!gfx_shader_read_conf_cgp(conf, cg_shader)) { RARCH_ERR("Failed to parse CGP file.\n"); config_file_free(conf); return false; } config_file_free(conf); gfx_shader_resolve_relative(cg_shader, path); if (cg_shader->passes > GFX_MAX_SHADERS - 3) { RARCH_WARN("Too many shaders ... Capping shader amount to %d.\n", GFX_MAX_SHADERS - 3); cg_shader->passes = GFX_MAX_SHADERS - 3; } for (i = 0; i < cg_shader->passes; i++) { if (!load_shader(i)) { RARCH_ERR("Failed to load shaders ...\n"); return false; } } if (!load_textures()) { RARCH_ERR("Failed to load lookup textures ...\n"); return false; } if (!load_imports()) { RARCH_ERR("Failed to load imports ...\n"); return false; } return true; }
int main(int argc, char *argv[]) { vita_elf_t *ve; vita_imports_t **imports; sce_module_info_t *module_info; sce_section_sizes_t section_sizes; void *encoded_modinfo; vita_elf_rela_table_t rtable = {}; int imports_count; int status = EXIT_SUCCESS; if (argc < 3) errx(EXIT_FAILURE,"Usage: vita-elf-create input-elf output-elf [extra.json ...]"); if ((ve = vita_elf_load(argv[1])) == NULL) return EXIT_FAILURE; if (!(imports = load_imports(argc, argv, &imports_count))) return EXIT_FAILURE; if (!vita_elf_lookup_imports(ve, imports, imports_count)) status = EXIT_FAILURE; if (ve->fstubs_ndx) { printf("Function stubs in section %d:\n", ve->fstubs_ndx); print_stubs(ve->fstubs, ve->num_fstubs); } if (ve->vstubs_ndx) { printf("Variable stubs in section %d:\n", ve->vstubs_ndx); print_stubs(ve->vstubs, ve->num_vstubs); } printf("Relocations:\n"); list_rels(ve); printf("Segments:\n"); list_segments(ve); module_info = sce_elf_module_info_create(ve); int total_size = sce_elf_module_info_get_size(module_info, §ion_sizes); int curpos = 0; printf("Total SCE data size: %d / %x\n", total_size, total_size); #define PRINTSEC(name) printf(" .%.*s.%s: %d (%x @ %x)\n", (int)strcspn(#name,"_"), #name, strchr(#name,'_')+1, section_sizes.name, section_sizes.name, curpos+ve->segments[0].vaddr+ve->segments[0].memsz); curpos += section_sizes.name PRINTSEC(sceModuleInfo_rodata); PRINTSEC(sceLib_ent); PRINTSEC(sceExport_rodata); PRINTSEC(sceLib_stubs); PRINTSEC(sceImport_rodata); PRINTSEC(sceFNID_rodata); PRINTSEC(sceFStub_rodata); PRINTSEC(sceVNID_rodata); PRINTSEC(sceVStub_rodata); strncpy(module_info->name, argv[1], sizeof(module_info->name) - 1); encoded_modinfo = sce_elf_module_info_encode( module_info, ve, §ion_sizes, &rtable); printf("Relocations from encoded modinfo:\n"); print_rtable(&rtable); FILE *outfile; Elf *dest; ASSERT(dest = elf_utils_copy_to_file(argv[2], ve->elf, &outfile)); ASSERT(elf_utils_duplicate_shstrtab(dest)); ASSERT(sce_elf_discard_invalid_relocs(ve, ve->rela_tables)); ASSERT(sce_elf_write_module_info(dest, ve, §ion_sizes, encoded_modinfo)); rtable.next = ve->rela_tables; ASSERT(sce_elf_write_rela_sections(dest, ve, &rtable)); ASSERT(sce_elf_rewrite_stubs(dest, ve)); ELF_ASSERT(elf_update(dest, ELF_C_WRITE) >= 0); elf_end(dest); ASSERT(sce_elf_set_headers(outfile, ve)); fclose(outfile); sce_elf_module_info_free(module_info); vita_elf_free(ve); int i; for (i = 0; i < imports_count; i++) { vita_imports_free(imports[i]); } free(imports); return status; failure: return EXIT_FAILURE; }