int writeSegs(FILE *dst, FILE *src, const scn_t *scns, const seg_t *segs, Elf32_Half phnum, const sceScns_t *sceScns, const char *strtab, const Elf32_Sym *symtab) { Elf32_Half i, j; int res; if (dst == NULL || src == NULL || scns == NULL || segs == NULL || sceScns == NULL || strtab == NULL) { return EINVAL; } for (i = 0; i < phnum; i++) { for (j = 0; j < segs->shnum; j++) { if (fseek(src, segs->scns[j]->orgOffset, SEEK_SET)) { perror(strtab + segs->scns[j]->shdr.sh_name); return errno; } if (fseek(dst, segs->scns[j]->shdr.sh_offset, SEEK_SET)) { perror(strtab + segs->scns[j]->shdr.sh_name); return errno; } if (segs->scns[j]->content != NULL) { if (fwrite(segs->scns[j]->content, segs->scns[j]->shdr.sh_size, 1, dst) != 1) { perror(strtab + segs->scns[j]->shdr.sh_name); return errno; } free(segs->scns[j]->content); segs->scns[j]->content = NULL; continue; } // Refer to updateSegs if (segs->scns[j]->shdr.sh_type == SHT_SCE_RELA) res = writeRela(dst, src, segs->scns[j], segs, scns, strtab, symtab, sceScns->modinfo); else if (segs->scns[j] == sceScns->modinfo) res = writeModinfo(dst, src, sceScns->modinfo, strtab); else res = writeScn(dst, src, segs->scns[j], strtab); if (res) return res; } segs++; } return 0; }
int writeSegs(FILE *dst, FILE *src, const seg_t *segs, Elf32_Half phnum, const char *strtab) { Elf32_Half i, j; int res; if (dst == NULL || src == NULL || segs == NULL || strtab == NULL) return EINVAL; for (i = 0; i < phnum; i++) { for (j = 0; j < segs->shnum; j++) { res = writeScn(dst, src, segs->scns[j], strtab); if (res) return res; } segs++; } return 0; }