@@ -474,97 +474,6 @@ Vec<uint8_t> create_elf64_x86_binary(Allocator &al, X86Assembler &a) {
474474 return bin;
475475}
476476
477-
478- void emit_elf64_header (X86Assembler &a) {
479- /* Elf64_Ehdr */
480- a.add_label (" ehdr" );
481- // e_ident
482- a.asm_db_imm8 (0x7F );
483- a.asm_db_imm8 (' E' );
484- a.asm_db_imm8 (' L' );
485- a.asm_db_imm8 (' F' );
486- a.asm_db_imm8 (2 );
487- a.asm_db_imm8 (1 );
488- a.asm_db_imm8 (1 );
489- a.asm_db_imm8 (0 );
490-
491- a.asm_db_imm8 (0 );
492- a.asm_db_imm8 (0 );
493- a.asm_db_imm8 (0 );
494- a.asm_db_imm8 (0 );
495-
496- a.asm_db_imm8 (0 );
497- a.asm_db_imm8 (0 );
498- a.asm_db_imm8 (0 );
499- a.asm_db_imm8 (0 );
500-
501- a.asm_dw_imm16 (2 ); // e_type
502- a.asm_dw_imm16 (0x3e ); // e_machine
503- a.asm_dd_imm32 (1 ); // e_version
504- a.asm_dq_label (" _start" ); // e_entry
505- a.asm_dq_label (" e_phoff" ); // e_phoff
506- a.asm_dq_imm64 (0 ); // e_shoff
507- a.asm_dd_imm32 (0 ); // e_flags
508- a.asm_dw_label (" ehdrsize" ); // e_ehsize
509- a.asm_dw_label (" phdrsize" ); // e_phentsize
510- a.asm_dw_imm16 (3 ); // e_phnum
511- a.asm_dw_imm16 (0 ); // e_shentsize
512- a.asm_dw_imm16 (0 ); // e_shnum
513- a.asm_dw_imm16 (0 ); // e_shstrndx
514-
515- /* Elf64_Phdr */
516- a.add_label (" phdr" );
517- a.asm_dd_imm32 (1 ); // p_type
518- a.asm_dd_imm32 (4 ); // p_flags (permission to read only)
519- a.asm_dq_imm64 (0 ); // p_offset
520- a.asm_dq_imm64 (a.origin ()); // p_vaddr
521- a.asm_dq_imm64 (a.origin ()); // p_paddr
522- a.asm_dq_label (" phdr_size" ); // p_filesz
523- a.asm_dq_label (" phdr_size" ); // p_memsz
524- a.asm_dq_imm64 (0x1000 ); // p_align
525-
526- /* text_segment_phdr */
527- a.add_label (" text_phdr" );
528- a.asm_dd_imm32 (1 ); // p_type
529- a.asm_dd_imm32 (5 ); // p_flags (permission to read and execute)
530- a.asm_dq_label (" text_segment_offset" ); // p_offset
531- a.asm_dq_label (" text_segment_start" ); // p_vaddr
532- a.asm_dq_label (" text_segment_start" ); // p_paddr
533- a.asm_dq_label (" text_segment_size" ); // p_filesz
534- a.asm_dq_label (" text_segment_size" ); // p_memsz
535- a.asm_dq_imm64 (0x1000 ); // p_align
536-
537- /* data_segment_phdr */
538- a.add_label (" data_phdr" );
539- a.asm_dd_imm32 (1 ); // p_type
540- a.asm_dd_imm32 (6 ); // p_flags (permission to read and write)
541- a.asm_dq_label (" data_segment_offset" ); // p_offset
542- a.asm_dq_label (" data_segment_start" ); // p_vaddr
543- a.asm_dq_label (" data_segment_start" ); // p_paddr
544- a.asm_dq_label (" data_segment_size" ); // p_filesz
545- a.asm_dq_label (" data_segment_size" ); // p_memsz
546- a.asm_dq_imm64 (0x1000 ); // p_align
547- }
548-
549- void emit_elf64_footer (X86Assembler &a) {
550- a.add_var (" ehdrsize" , " ehdr" , " phdr" );
551- a.add_var (" phdrsize" , " phdr" , " text_phdr" );
552- a.add_var64 (" e_phoff" , " ehdr" , " phdr" );
553- a.add_var64 (" phdr_size" , " ehdr" , " text_segment_start" );
554- a.add_var64 (" text_segment_offset" , " ehdr" , " text_segment_start" );
555- a.add_var64 (" text_segment_size" , " text_segment_start" , " text_segment_end" );
556- a.add_var64 (" data_segment_offset" , " ehdr" , " data_segment_start" );
557- a.add_var64 (" data_segment_size" , " data_segment_start" , " data_segment_end" );
558- }
559-
560- void emit_exit_64 (X86Assembler &a, std::string name, int exit_code) {
561- a.add_label (name);
562- // void exit(int status);
563- a.asm_mov_r64_imm64 (LCompilers::X64Reg::rax, 60 ); // sys_exit
564- a.asm_mov_r64_imm64 (LCompilers::X64Reg::rdi, exit_code); // exit code
565- a.asm_syscall (); // syscall
566- }
567-
568477void emit_print_64 (X86Assembler &a, const std::string &msg_label, uint64_t size)
569478{
570479 // mov rax, 1 ; write(
0 commit comments