Skip to content

Instantly share code, notes, and snippets.

@uyjulian
Created December 23, 2023 00:12
Show Gist options
  • Save uyjulian/e0f7f67be670cd1d730ca91b96863387 to your computer and use it in GitHub Desktop.
Save uyjulian/e0f7f67be670cd1d730ca91b96863387 to your computer and use it in GitHub Desktop.
static void section_reorder_hoge()
{
// FIXME: Do we actually need to do this?
{
elf_loader_psegment_t psegment_tmp[ELF_LOADER_MAX_PROGRAM_HEADERS];
memset(psegment_tmp, 0, sizeof(psegment_tmp));
// Calculate output buffer offsets in order of load address
{
int i;
unsigned int kv_count;
kv_count = 0;
elf_loader_keyval_t kvinfo[ELF_LOADER_MAX_PROGRAM_HEADERS];
for (i = 0; i < flhs->elf_header.e_phnum; i += 1) {
elf_loader_elf32_phdr_t *program_header;
program_header = &flhs->program_header[i];
if (program_header->p_type == 1 && program_header->p_filesz != 0) {
kvinfo[kv_count].kv_key = i;
kvinfo[kv_count].kv_value = program_header->p_vaddr;
kv_count += 1;
}
}
psegment_count = kv_count;
sort_keyval_contents(kv_count, kvinfo);
for (i = 0; i < kv_count; i += 1) {
elf_loader_elf32_phdr_t *program_header;
u32 key = kvinfo[i].kv_key;
program_header = &flhs->program_header[key];
psegment_tmp[key].buf_size = program_header->p_filesz;
psegment_tmp[key].inbuf_offset = program_header->p_offset;
psegment_tmp[key].outbuf_offset = total_filesize;
psegment_tmp[key].load_address = program_header->p_vaddr;
total_filesize += program_header->p_filesz;
}
}
// Rearrange in order of file offsets
{
int i;
unsigned int kv_count;
kv_count = 0;
elf_loader_keyval_t kvinfo[ELF_LOADER_MAX_PROGRAM_HEADERS];
for (i = 0; i < flhs->elf_header.e_phnum; i += 1) {
elf_loader_elf32_phdr_t *program_header;
program_header = &flhs->program_header[i];
if (program_header->p_type == 1 && program_header->p_filesz != 0) {
kvinfo[kv_count].kv_key = i;
kvinfo[kv_count].kv_value = program_header->p_offset;
kv_count += 1;
}
}
sort_keyval_contents(kv_count, kvinfo);
for (i = 0; i < kv_count; i += 1) {
memcpy(&psegment[i], &psegment_tmp[kvinfo[i].kv_key], sizeof(elf_loader_psegment_t));
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment