@@ -319,7 +319,7 @@ impl ElfWriter {
319319 let ehdr_size = 64usize ;
320320 let phdr_size = 56usize ;
321321 let shdr_size = 64usize ;
322- let num_phdrs = 2usize ; // PT_LOAD for .text, PT_DYNAMIC
322+ let num_phdrs = 3usize ; // PT_LOAD for .text, PT_LOAD for dynamic sections , PT_DYNAMIC
323323 let num_sections = 9usize ; // NULL, .text, .dynamic, .dynsym, .dynstr, .rel.dyn, .strtab, .symtab, .shstrtab
324324
325325 let text_offset = 0x1000usize ;
@@ -391,13 +391,15 @@ impl ElfWriter {
391391 elf. extend_from_slice ( & ( ( num_sections - 1 ) as u16 ) . to_le_bytes ( ) ) ; // e_shstrndx
392392
393393 // ==================== Program Headers ====================
394- // PT_LOAD for .text + dynamic sections
395- let load_size = text_size + dynamic_size + dynsym_size + dynstr_size + reldyn_size;
396- self . write_phdr_aligned ( & mut elf, PT_LOAD , PF_R | PF_X , text_offset, TEXT_VADDR , load_size) ;
394+ // PT_LOAD #1: .text only (like Solana's layout)
395+ self . write_phdr_aligned ( & mut elf, PT_LOAD , PF_R | PF_X , text_offset, TEXT_VADDR , text_size) ;
396+
397+ // PT_LOAD #2: Dynamic sections (.dynsym, .dynstr, .rel.dyn) in separate segment
398+ let dyn_sections_size = dynsym_size + dynstr_size + reldyn_size;
399+ self . write_phdr_aligned ( & mut elf, PT_LOAD , PF_R , dynsym_offset, dynsym_vaddr, dyn_sections_size) ;
397400
398- // PT_DYNAMIC - must cover .dynamic, .dynsym, .dynstr, and .rel.dyn
399- let dynamic_segment_size = dynamic_size + dynsym_size + dynstr_size + reldyn_size;
400- self . write_phdr_aligned ( & mut elf, PT_DYNAMIC , PF_R | PF_W , dynamic_offset, dynamic_vaddr, dynamic_segment_size) ;
401+ // PT_DYNAMIC: Just .dynamic section
402+ self . write_phdr_aligned ( & mut elf, PT_DYNAMIC , PF_R | PF_W , dynamic_offset, dynamic_vaddr, dynamic_size) ;
401403
402404 // Padding to 0x1000
403405 while elf. len ( ) < text_offset {
@@ -409,9 +411,9 @@ impl ElfWriter {
409411
410412 // ==================== .dynamic Section ====================
411413 // Match Solana's test ELF format
412- // DT_FLAGS (TEXTREL flag = 0x8 )
414+ // DT_FLAGS (TEXTREL flag = 0x4, matching Solana's test ELF )
413415 elf. extend_from_slice ( & DT_FLAGS . to_le_bytes ( ) ) ;
414- elf. extend_from_slice ( & 0x8u64 . to_le_bytes ( ) ) ; // TEXTREL
416+ elf. extend_from_slice ( & 0x4u64 . to_le_bytes ( ) ) ; // DF_TEXTREL flag
415417 // DT_REL
416418 elf. extend_from_slice ( & DT_REL . to_le_bytes ( ) ) ;
417419 elf. extend_from_slice ( & reldyn_vaddr. to_le_bytes ( ) ) ;
0 commit comments