@@ -209,49 +209,51 @@ void elf_generate_program_headers(void)
209
209
phdr .p_memsz = elf_code -> size + elf_data -> size + elf_rodata -> size +
210
210
elf_bss_size ; /* size in memory */
211
211
phdr .p_flags = 7 ; /* flags */
212
- phdr .p_align = 4 ; /* alignment */
212
+ phdr .p_align = 0x1000 ; /* alignment */
213
213
elf_write_blk (elf_program_header , & phdr , sizeof (elf32_phdr_t ));
214
214
if (dynlink ) {
215
215
/* program header - all dynamic sections combined */
216
216
phdr .p_type = 1 ; /* PT_LOAD */
217
217
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 */
221
221
phdr .p_filesz = elf_interp -> size + elf_relplt -> size + elf_plt -> size +
222
222
elf_got -> size + elf_dynstr -> size + elf_dynsym -> size +
223
223
elf_dynamic -> size ; /* size in file */
224
224
phdr .p_memsz = elf_interp -> size + elf_relplt -> size + elf_plt -> size +
225
225
elf_got -> size + elf_dynstr -> size + elf_dynsym -> size +
226
226
elf_dynamic -> size ; /* size in memory */
227
227
phdr .p_flags = 7 ; /* flags */
228
- phdr .p_align = 4 ; /* alignment */
228
+ phdr .p_align = 0x1000 ; /* alignment */
229
229
elf_write_blk (elf_program_header , & phdr , sizeof (elf32_phdr_t ));
230
230
231
231
/* program header - program interpreter (.interp section) */
232
232
phdr .p_type = 3 ; /* PT_INTERP */
233
233
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 */
241
241
elf_write_blk (elf_program_header , & phdr , sizeof (elf32_phdr_t ));
242
242
243
243
/* program header - .dynamic section */
244
244
phdr .p_type = 2 ; /* PT_DYNAMIC */
245
245
phdr .p_offset = elf_header_len + elf_code -> size + elf_data -> size +
246
246
elf_rodata -> size + elf_interp -> size + elf_relplt -> size +
247
247
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 */
255
257
elf_write_blk (elf_program_header , & phdr , sizeof (elf32_phdr_t ));
256
258
}
257
259
}
@@ -587,7 +589,7 @@ void elf_generate_sections(void)
587
589
got_size += PTR_SIZE ;
588
590
589
591
/* 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 ;
591
593
elf_relplt_start = elf_interp_start + elf_interp -> size ;
592
594
elf_plt_start = elf_relplt_start + relplt_size ;
593
595
elf_got_start = elf_plt_start + plt_size ;
0 commit comments