Exemplo n.º 1
0
Arquivo: seg.c Projeto: TYYK04/psp2sdk
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;
}
Exemplo n.º 2
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;
}