elfer-hello.s (3943B)
1 # --------------------- CONSTANTS ------------------------- # 2 3 .set SYSCALL_READ, 0 4 .set SYSCALL_WRITE, 1 5 .set SYSCALL_OPEN, 2 6 .set SYSCALL_CLOSE, 3 7 .set SYSCALL_EXIT, 60 8 .set SYSCALL_GETRLIMIT, 97 9 10 .set FLAG_O_CREAT_RDWR, 0x42 # O_RDWR | O_CREAT 11 .set FILE_MODE, 0x1ED # rwxr-xr-x 12 13 .set STDIN, 0 14 .set STDOUT, 1 15 .set STDERR, 2 16 17 .include "./elf-struct.s" 18 19 20 # --------------------- DATA ------------------------- # 21 .data 22 23 file_path: 24 .asciz "./bin/hello.elf" 25 26 machine_code: 27 .byte 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00 28 .byte 0xc7, 0xc7, 0x01, 0x00, 0x00, 0x00 29 .byte 0xc7, 0xc6, 0xf0, 0x00, 0x60, 0x00 30 .byte 0xc7, 0xc2, 0x10, 0x00, 0x00, 0x00 31 .byte 0x0f, 0x05 32 .byte 0xc7, 0xc7, 0x00, 0x00, 0x00, 0x00 33 .byte 0xc7, 0xc0, 0x3c, 0x00, 0x00, 0x00 34 .byte 0x0f, 0x05 35 machine_code_sz = . - machine_code 36 37 padding_8b: 38 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 39 40 msg: 41 .asciz "hello, world\n" 42 msg_len = . - msg 43 44 45 46 .bss 47 ph_array: 48 .space 2*p_header_size 49 50 # --------------------- CODE ------------------------- # 51 .global _start 52 53 .text 54 55 _start: 56 57 mov $file_path, %rdi 58 mov $FLAG_O_CREAT_RDWR, %rsi 59 mov $FILE_MODE, %rdx 60 mov $SYSCALL_OPEN, %rax 61 syscall 62 63 # -------------- ELF header ---------# 64 lea elf_header, %r8 65 lea eh_idx_ident(%r8), %r9 66 movb $0x7F, ei_idx_mag0(%r9) 67 movb $0x45, ei_idx_mag1(%r9) 68 movb $0x4C, ei_idx_mag2(%r9) 69 movb $0x46, ei_idx_mag3(%r9) 70 movb $ei_val_class_64, ei_idx_class(%r9) 71 movb $ei_val_data_lsb, ei_idx_data(%r9) 72 movb $ev_val_current, ei_idx_version(%r9) 73 74 lea eh_idx_type(%r8), %r9 75 movw $et_val_exec, (%r9) 76 77 lea eh_idx_machine(%r8), %r9 78 movw $em_val_x8664, (%r9) 79 80 lea eh_idx_version(%r8), %r9 81 movl $ev_val_current, (%r9) 82 83 lea eh_idx_entry(%r8), %r9 84 movq $0x4000C0, (%r9) 85 86 lea eh_idx_phoff(%r8), %r9 87 movq $0x40, (%r9) 88 89 lea eh_idx_ehsize(%r8), %r9 90 movw $0x40, (%r9) 91 92 lea eh_idx_phentsize(%r8), %r9 93 movw $0x38, (%r9) 94 95 lea eh_idx_phnum(%r8), %r9 96 movw $0x2, (%r9) 97 98 # -------- Program header 1: code -------# 99 lea ph_array, %r8 100 lea ph_idx_type(%r8), %r9 101 movl $pt_val_load, (%r9) 102 103 lea ph_idx_flags(%r8), %r9 104 movl $0x5, (%r9) 105 106 lea ph_idx_vaddr(%r8), %r9 107 movq $0x400000, (%r9) 108 109 lea ph_idx_filesz(%r8), %r9 110 movq $0xE8, (%r9) 111 112 lea ph_idx_memsz(%r8), %r9 113 movq $0xE8, (%r9) 114 115 lea ph_idx_align(%r8), %r9 116 movq $0x1000, (%r9) 117 118 # -------- Program header 2: read-only data -------# 119 lea ph_array + p_header_size, %r8 120 lea ph_idx_type(%r8), %r9 121 movl $pt_val_load, (%r9) 122 123 lea ph_idx_flags(%r8), %r9 124 movl $0x4, (%r9) 125 126 lea ph_idx_vaddr(%r8), %r9 127 movq $0x600000, (%r9) 128 129 lea ph_idx_filesz(%r8), %r9 130 movq $0x0100, (%r9) 131 132 lea ph_idx_memsz(%r8), %r9 133 movq $0x0100, (%r9) 134 135 lea ph_idx_align(%r8), %r9 136 movq $0x1000, (%r9) 137 138 # write elf_header to the file 139 mov %rax, %rdi 140 lea elf_header, %rsi 141 mov $elf_header_size, %rdx 142 mov $SYSCALL_WRITE, %rax 143 syscall 144 145 # write program header 1 to the file 146 lea ph_array, %rsi 147 mov $p_header_size, %rdx 148 mov $SYSCALL_WRITE, %rax 149 syscall 150 151 # write program header 2 to the file 152 lea ph_array+p_header_size, %rsi 153 mov $p_header_size, %rdx 154 mov $SYSCALL_WRITE, %rax 155 syscall 156 157 # write padding 158 lea padding_8b, %rsi 159 mov $8, %rdx 160 mov $SYSCALL_WRITE, %rax 161 syscall 162 163 # write padding 164 lea padding_8b, %rsi 165 mov $8, %rdx 166 mov $SYSCALL_WRITE, %rax 167 syscall 168 169 # write machine code to the file 170 lea machine_code, %rsi 171 mov $machine_code_sz, %rdx 172 mov $SYSCALL_WRITE, %rax 173 syscall 174 175 # write padding 176 lea padding_8b, %rsi 177 mov $8, %rdx 178 mov $SYSCALL_WRITE, %rax 179 syscall 180 181 # write msg string to the file 182 lea msg, %rsi 183 mov $msg_len, %rdx 184 mov $SYSCALL_WRITE, %rax 185 syscall 186 187 xor %rdi, %rdi 188 mov $SYSCALL_EXIT, %rax 189 syscall