I preffer to manage my stuff using Guix, see: Installation.
Then:
[env]$ guix shell --container
[env]$ ./elf.sh
[env]$ make new-elf
[env]$ hexdump -C new-elfTry to copy it to clipboard:
$ xsel -b < new-elf
$ xsel -b | hexdump -C| elf | |
| object-replacement.char | |
| new-elf |
I preffer to manage my stuff using Guix, see: Installation.
Then:
[env]$ guix shell --container
[env]$ ./elf.sh
[env]$ make new-elf
[env]$ hexdump -C new-elfTry to copy it to clipboard:
$ xsel -b < new-elf
$ xsel -b | hexdump -C| ; source: https://nathanotterness.com/2021/10/tiny_elf_modernized.html | |
| [bits 64] | |
| file_load_va: equ 4096 * 40 | |
| db 0x7f, 'E', 'L', 'F' | |
| db 2 | |
| db 1 | |
| db 1 | |
| db 0 | |
| entry_point: | |
| xor eax, eax | |
| inc eax | |
| mov edi, eax | |
| jmp code_chunk_2 | |
| dw 2 | |
| dw 0x3e | |
| dd 1 | |
| dq entry_point + file_load_va | |
| dq program_headers_start | |
| code_chunk_2: | |
| mov esi, file_load_va + message | |
| xor edx, edx | |
| mov dl, message_length | |
| jmp code_chunk_3 | |
| db 0 | |
| dw 64 | |
| dw 0x38 | |
| dw 1 | |
| ; We simply deleted the three two-byte fields that used to be here. The only | |
| ; one that mattered, the number of section headers, will still be zero due to | |
| ; the upper two bytes of the field at the start of the program header being | |
| ; zero. | |
| program_headers_start: | |
| ; These next two fields also serve as the final six bytes of the ELF header. | |
| dd 1 | |
| dd 5 | |
| dq 0 | |
| dq file_load_va | |
| code_chunk_3: | |
| syscall | |
| mov al, 60 | |
| xor edi, edi | |
| syscall | |
| dq file_end | |
| dq file_end | |
| message: db `Hello, world!\n` | |
| message_length: equ $ - message | |
| file_end: |
| #!/bin/sh | |
| make elf | |
| chmod +x elf | |
| exec ./elf |
| elf: elf.S | |
| nasm -f bin -o elf elf.S | |
| object-replacement.char: | |
| printf '\xef\xbf\xbc' > object-replacement.char # is U+FFFC in UTF-8 | |
| new-elf: elf object-replacement.char | |
| cat object-replacement.char elf > new-elf | |
| .PHONY: clean | |
| clean: | |
| rm -f elf object-replacement.char new-elf |
| (use-modules | |
| (guix profiles) | |
| (guix config) | |
| (gnu packages base) | |
| (gnu packages assembly) | |
| (gnu packages linux)) | |
| (packages->manifest | |
| (list | |
| gnu-make | |
| nasm | |
| util-linux ; printf | |
| coreutils)) ; rm |