Skip to content

Commit a6961fc

Browse files
committed
[WIP] Fix information of segments
1 parent 09209ca commit a6961fc

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

src/elf.c

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -209,49 +209,51 @@ void elf_generate_program_headers(void)
209209
phdr.p_memsz = elf_code->size + elf_data->size + elf_rodata->size +
210210
elf_bss_size; /* size in memory */
211211
phdr.p_flags = 7; /* flags */
212-
phdr.p_align = 4; /* alignment */
212+
phdr.p_align = 0x1000; /* alignment */
213213
elf_write_blk(elf_program_header, &phdr, sizeof(elf32_phdr_t));
214214
if (dynlink) {
215215
/* program header - all dynamic sections combined */
216216
phdr.p_type = 1; /* PT_LOAD */
217217
phdr.p_offset = elf_header_len + elf_code->size + elf_data->size +
218-
elf_rodata->size; /* offset of segment */
219-
phdr.p_vaddr = ELF_START + phdr.p_offset; /* virtual address */
220-
phdr.p_paddr = ELF_START + phdr.p_offset; /* physical address */
218+
elf_rodata->size; /* offset of segment */
219+
phdr.p_vaddr = elf_interp_start; /* virtual address */
220+
phdr.p_paddr = elf_interp_start; /* physical address */
221221
phdr.p_filesz = elf_interp->size + elf_relplt->size + elf_plt->size +
222222
elf_got->size + elf_dynstr->size + elf_dynsym->size +
223223
elf_dynamic->size; /* size in file */
224224
phdr.p_memsz = elf_interp->size + elf_relplt->size + elf_plt->size +
225225
elf_got->size + elf_dynstr->size + elf_dynsym->size +
226226
elf_dynamic->size; /* size in memory */
227227
phdr.p_flags = 7; /* flags */
228-
phdr.p_align = 4; /* alignment */
228+
phdr.p_align = 0x1000; /* alignment */
229229
elf_write_blk(elf_program_header, &phdr, sizeof(elf32_phdr_t));
230230

231231
/* program header - program interpreter (.interp section) */
232232
phdr.p_type = 3; /* PT_INTERP */
233233
phdr.p_offset = elf_header_len + elf_code->size + elf_data->size +
234-
elf_rodata->size; /* offset of segment */
235-
phdr.p_vaddr = ELF_START + phdr.p_offset; /* virtual address */
236-
phdr.p_paddr = ELF_START + phdr.p_offset; /* physical address */
237-
phdr.p_filesz = strlen(DYN_LINKER) + 1; /* size in file */
238-
phdr.p_memsz = strlen(DYN_LINKER) + 1; /* size in memory */
239-
phdr.p_flags = 4; /* flags */
240-
phdr.p_align = 1; /* alignment */
234+
elf_rodata->size; /* offset of segment */
235+
phdr.p_vaddr = elf_interp_start; /* virtual address */
236+
phdr.p_paddr = elf_interp_start; /* physical address */
237+
phdr.p_filesz = strlen(DYN_LINKER) + 1; /* size in file */
238+
phdr.p_memsz = strlen(DYN_LINKER) + 1; /* size in memory */
239+
phdr.p_flags = 4; /* flags */
240+
phdr.p_align = 1; /* alignment */
241241
elf_write_blk(elf_program_header, &phdr, sizeof(elf32_phdr_t));
242242

243243
/* program header - .dynamic section */
244244
phdr.p_type = 2; /* PT_DYNAMIC */
245245
phdr.p_offset = elf_header_len + elf_code->size + elf_data->size +
246246
elf_rodata->size + elf_interp->size + elf_relplt->size +
247247
elf_plt->size + elf_got->size + elf_dynstr->size +
248-
elf_dynsym->size; /* offset of segment */
249-
phdr.p_vaddr = ELF_START + phdr.p_offset; /* virtual address */
250-
phdr.p_paddr = ELF_START + phdr.p_offset; /* physical address */
251-
phdr.p_filesz = elf_dynamic->size; /* size in file */
252-
phdr.p_memsz = elf_dynamic->size; /* size in memory */
253-
phdr.p_flags = 6; /* flags */
254-
phdr.p_align = 4; /* alignment */
248+
elf_dynsym->size; /* offset of segment */
249+
phdr.p_vaddr = elf_got_start + elf_got->size + elf_dynstr->size +
250+
elf_dynsym->size; /* virtual address */
251+
phdr.p_paddr = elf_got_start + elf_got->size + elf_dynstr->size +
252+
elf_dynsym->size; /* physical address */
253+
phdr.p_filesz = elf_dynamic->size; /* size in file */
254+
phdr.p_memsz = elf_dynamic->size; /* size in memory */
255+
phdr.p_flags = 6; /* flags */
256+
phdr.p_align = 4; /* alignment */
255257
elf_write_blk(elf_program_header, &phdr, sizeof(elf32_phdr_t));
256258
}
257259
}
@@ -587,7 +589,7 @@ void elf_generate_sections(void)
587589
got_size += PTR_SIZE;
588590

589591
/* Get the starting points of the sections. */
590-
elf_interp_start = elf_bss_start + elf_bss_size;
592+
elf_interp_start = elf_bss_start + elf_bss_size + 0x1000;
591593
elf_relplt_start = elf_interp_start + elf_interp->size;
592594
elf_plt_start = elf_relplt_start + relplt_size;
593595
elf_got_start = elf_plt_start + plt_size;

0 commit comments

Comments
 (0)