@@ -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