@@ -378,38 +378,13 @@ Elf64_Ehdr get_elf_header(uint64_t asm_entry) {
378
378
return e;
379
379
}
380
380
381
- Elf64_Phdr get_program_header (uint64_t addr_origin, uint64_t seg_size) {
381
+ Elf64_Phdr get_seg_header (uint32_t flags, uint64_t origin_addr,
382
+ uint64_t seg_size, uint64_t prev_seg_offset, uint64_t prev_seg_size) {
382
383
Elf64_Phdr p;
383
384
p.type = 1 ;
384
- p.flags = 4 ;
385
- p.offset = 0 ;
386
- p.vaddr = addr_origin;
387
- p.paddr = p.vaddr ;
388
- p.filesz = seg_size;
389
- p.memsz = p.filesz ;
390
- p.align = 0x1000 ;
391
- return p;
392
- }
393
-
394
- Elf64_Phdr get_text_segment (uint64_t addr_origin, uint64_t prev_seg_offset, uint64_t prev_seg_size, uint64_t seg_size) {
395
- Elf64_Phdr p;
396
- p.type = 1 ;
397
- p.flags = 5 ;
385
+ p.flags = flags;
398
386
p.offset = prev_seg_offset + prev_seg_size;
399
- p.vaddr = addr_origin + p.offset ;
400
- p.paddr = p.vaddr ;
401
- p.filesz = seg_size;
402
- p.memsz = p.filesz ;
403
- p.align = 0x1000 ;
404
- return p;
405
- }
406
-
407
- Elf64_Phdr get_data_segment (uint64_t addr_origin, uint64_t prev_seg_offset, uint64_t prev_seg_size, uint64_t seg_size) {
408
- Elf64_Phdr p;
409
- p.type = 1 ;
410
- p.flags = 6 ;
411
- p.offset = prev_seg_offset + prev_seg_size;
412
- p.vaddr = addr_origin + p.offset ;
387
+ p.vaddr = origin_addr + p.offset ;
413
388
p.paddr = p.vaddr ;
414
389
p.filesz = seg_size;
415
390
p.memsz = p.filesz ;
@@ -457,11 +432,13 @@ Vec<uint8_t> create_elf64_x86_binary(Allocator &al, X86Assembler &a) {
457
432
uint64_t origin_addr = a.origin () - HEADER_SEGMENT_SIZE;
458
433
459
434
Elf64_Ehdr e = get_elf_header (a.get_defined_symbol (" _start" ).value );
460
- Elf64_Phdr p_program = get_program_header (origin_addr, HEADER_SEGMENT_SIZE);
461
- Elf64_Phdr p_text_seg = get_text_segment (origin_addr, p_program.offset , p_program.filesz ,
462
- a.get_defined_symbol (" text_segment_end" ).value - a.get_defined_symbol (" text_segment_start" ).value );
463
- Elf64_Phdr p_data_seg = get_data_segment (origin_addr, p_text_seg.offset , p_text_seg.filesz ,
464
- a.get_defined_symbol (" data_segment_end" ).value - a.get_defined_symbol (" data_segment_start" ).value );
435
+ Elf64_Phdr p_program = get_seg_header (4 , origin_addr, HEADER_SEGMENT_SIZE, 0 , 0 );
436
+
437
+ const uint64_t text_seg_size = a.get_defined_symbol (" text_segment_end" ).value - a.get_defined_symbol (" text_segment_start" ).value ;
438
+ Elf64_Phdr p_text_seg = get_seg_header (5 , origin_addr, text_seg_size, p_program.offset , p_program.filesz );
439
+
440
+ const uint64_t data_seg_size = a.get_defined_symbol (" data_segment_end" ).value - a.get_defined_symbol (" data_segment_start" ).value ;
441
+ Elf64_Phdr p_data_seg = get_seg_header (6 , origin_addr, data_seg_size, p_text_seg.offset , p_text_seg.filesz );
465
442
466
443
Vec<uint8_t > bin;
467
444
bin.reserve (al, HEADER_SEGMENT_SIZE);
0 commit comments