11
11
namespace LCompilers {
12
12
13
13
void X86Assembler::save_binary64 (const std::string &filename) {
14
- Vec<uint8_t > header = create_elf64_x86_header (m_al, *this );
14
+ Vec<uint8_t > header = create_elf64_x86_header (
15
+ m_al, origin (), get_defined_symbol (" _start" ).value ,
16
+ compute_seg_size (" text_segment_start" , " text_segment_end" ),
17
+ compute_seg_size (" data_segment_start" , " data_segment_end" ));
15
18
{
16
19
std::ofstream out;
17
20
out.open (filename);
@@ -425,7 +428,8 @@ void align_by_byte(Allocator &al, Vec<uint8_t> &code, uint64_t alignment) {
425
428
}
426
429
}
427
430
428
- Vec<uint8_t > create_elf64_x86_header (Allocator &al, X86Assembler &a) {
431
+ Vec<uint8_t > create_elf64_x86_header (Allocator &al, uint64_t origin, uint64_t entry,
432
+ uint64_t text_seg_size, uint64_t data_seg_size) {
429
433
430
434
/*
431
435
The header segment is a segment which holds the elf and program headers.
@@ -445,15 +449,11 @@ Vec<uint8_t> create_elf64_x86_header(Allocator &al, X86Assembler &a) {
445
449
const int HEADER_SEGMENT_SIZE = 0x1000 ;
446
450
447
451
// adjust/offset the origin address as per the extra bytes of HEADER_SEGMENT_SIZE
448
- uint64_t origin_addr = a. origin () - HEADER_SEGMENT_SIZE;
452
+ uint64_t origin_addr = origin - HEADER_SEGMENT_SIZE;
449
453
450
- Elf64_Ehdr e = get_elf_header (a. get_defined_symbol ( " _start " ). value );
454
+ Elf64_Ehdr e = get_elf_header (entry );
451
455
Elf64_Phdr p_program = get_seg_header (4 , origin_addr, HEADER_SEGMENT_SIZE, 0 , 0 );
452
-
453
- const uint64_t text_seg_size = a.get_defined_symbol (" text_segment_end" ).value - a.get_defined_symbol (" text_segment_start" ).value ;
454
456
Elf64_Phdr p_text_seg = get_seg_header (5 , origin_addr, text_seg_size, p_program.offset , p_program.filesz );
455
-
456
- const uint64_t data_seg_size = a.get_defined_symbol (" data_segment_end" ).value - a.get_defined_symbol (" data_segment_start" ).value ;
457
457
Elf64_Phdr p_data_seg = get_seg_header (6 , origin_addr, data_seg_size, p_text_seg.offset , p_text_seg.filesz );
458
458
459
459
Vec<uint8_t > header;
0 commit comments