|
11 | 11 | namespace LCompilers {
|
12 | 12 |
|
13 | 13 | void X86Assembler::save_binary64(const std::string &filename) {
|
14 |
| - Vec<uint8_t> bin = create_elf64_x86_binary(m_al, *this); |
| 14 | + Vec<uint8_t> header = create_elf64_x86_header(m_al, *this); |
15 | 15 | {
|
16 | 16 | std::ofstream out;
|
17 | 17 | out.open(filename);
|
18 |
| - out.write((const char*) bin.p, bin.size()); |
| 18 | + out.write((const char*) header.p, header.size()); |
| 19 | + out.write((const char*) m_code.p, m_code.size()); |
19 | 20 | }
|
20 | 21 | #ifdef LFORTRAN_LINUX
|
21 | 22 | std::string mode = "0755";
|
@@ -424,7 +425,7 @@ void align_by_byte(Allocator &al, Vec<uint8_t> &code, uint64_t alignment) {
|
424 | 425 | }
|
425 | 426 | }
|
426 | 427 |
|
427 |
| -Vec<uint8_t> create_elf64_x86_binary(Allocator &al, X86Assembler &a) { |
| 428 | +Vec<uint8_t> create_elf64_x86_header(Allocator &al, X86Assembler &a) { |
428 | 429 |
|
429 | 430 | /*
|
430 | 431 | The header segment is a segment which holds the elf and program headers.
|
@@ -455,23 +456,19 @@ Vec<uint8_t> create_elf64_x86_binary(Allocator &al, X86Assembler &a) {
|
455 | 456 | const uint64_t data_seg_size = a.get_defined_symbol("data_segment_end").value - a.get_defined_symbol("data_segment_start").value;
|
456 | 457 | Elf64_Phdr p_data_seg = get_seg_header(6, origin_addr, data_seg_size, p_text_seg.offset, p_text_seg.filesz);
|
457 | 458 |
|
458 |
| - Vec<uint8_t> bin; |
459 |
| - bin.reserve(al, HEADER_SEGMENT_SIZE); |
| 459 | + Vec<uint8_t> header; |
| 460 | + header.reserve(al, HEADER_SEGMENT_SIZE); |
460 | 461 |
|
461 | 462 | {
|
462 |
| - append_header_bytes(al, e, bin); |
463 |
| - append_header_bytes(al, p_program, bin); |
464 |
| - append_header_bytes(al, p_text_seg, bin); |
465 |
| - append_header_bytes(al, p_data_seg, bin); |
466 |
| - |
467 |
| - LCompilers::align_by_byte(al, bin, 0x1000); |
468 |
| - } |
| 463 | + append_header_bytes(al, e, header); |
| 464 | + append_header_bytes(al, p_program, header); |
| 465 | + append_header_bytes(al, p_text_seg, header); |
| 466 | + append_header_bytes(al, p_data_seg, header); |
469 | 467 |
|
470 |
| - for (auto b:a.get_machine_code()) { |
471 |
| - bin.push_back(al, b); |
| 468 | + LCompilers::align_by_byte(al, header, 0x1000); |
472 | 469 | }
|
473 | 470 |
|
474 |
| - return bin; |
| 471 | + return header; |
475 | 472 | }
|
476 | 473 |
|
477 | 474 | void emit_print_64(X86Assembler &a, const std::string &msg_label, uint64_t size)
|
|
0 commit comments