πΎ Archived View for any-key.press βΊ esoteric βΊ gnu_as_hello_world.gmi captured on 2024-12-17 at 09:33:06. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
ΠΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΠ»Π°ΡΡ ΠΌΠ½Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°-Π·Π°Π³Π»ΡΡΠΊΠ°, Π²ΡΠ²ΠΎΠ΄ΡΡΠ°Ρ "Hello, world!" Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ²ΠΎΠ΄Π°. ΠΠ° GNU Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ Π΄Π»Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ x86_64 (amd64). Π Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Π½Π½Π°Ρ Ρ libc (ΡΡΡ Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Ρ ΠΏΠ»Π°ΠΌΠ΅Π½Π½ΡΠΉ ΠΏΡΠΈΠ²Π΅Ρ OpenBSD, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅Π»ΡΠ·Ρ ΠΏΡΠΎΡΡΠΎ Π²Π·ΡΡΡ ΠΈ Π²ΡΠ·Π²Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ²).
Π‘ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ GNU'ΡΡΠΉ Π΄ΠΈΠ°Π»Π΅ΠΊΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° ΠΌΠ½Π΅ Π·Π½Π°ΠΊΠΎΠΌ ΠΏΠ»ΠΎΡ ΠΎ. ΠΡΠ°ΠΊΡΠΈΠΊΠ° ΠΏΠΎΠ»Π΅Π·Π½Π°:
.global main .extern write, exit .section .rodata message: .ascii "Hello, world!\n" .section .text main: mov $1, %rdi /* STDOUT */ lea message(%rip), %rsi mov $14, %rdx call write xor %rdi, %rdi call exit
Π Ρ Π΄ΡΡΠ³ΠΎΠΉ Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° "ΡΡΠΊΠ°ΠΌΠΈ" (Π½Ρ ΡΠΎΡΠ½Π΅Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ld) Π½Π΅ ΡΠΎΠ±ΠΈΡΠ°Π» ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Π½Π½ΡΠ΅ ELF'Ρ. ΠΠΊΠ°Π·Π°Π»ΠΎΡΡ ΡΡΠΎ ΡΠΎΡ Π΅ΡΡ Π³Π΅ΠΌΠΎΡΡΠΎΠΉ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ crt ΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°-ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊΠ° Π½Π° ΡΠ°Π·Π½ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ : Debian, Alpine ΠΈ OpenBSD. ΠΠ»ΡΠ½ΡΠ» ΠΈ Π΄Π»Ρ ΠΊΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ cc (ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ hello.s ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΠΎΠΌ Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π²ΡΡΠ΅):
$ as -o hello.o hello.s $ cc -l c -o hello hello.o
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ cc ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎΠΏΡΠΈΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ°ΡΠΈ (-v). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΠ΅ ΠΎΠΏΡΠΈΠΈ Π²ΡΠ·ΠΎΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊΠ° ld.
ΠΠ°ΡΠ΅ΠΌ Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ» main Π² _my_start:
$ cat hello.s .global _my_start .extern write, exit .section .rodata message: .ascii "Hello, world!\n" .section .text _my_start: mov $1, %rdi /* STDOUT */ lea message(%rip), %rsi mov $14, %rdx call write xor %rdi, %rdi call exit
Π Π΄Π°Π»Π΅Π΅ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ Π»ΠΈΡΠ½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊΠ° ld. ΠΠ°ΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±ΡΡΡ ΡΠΌΠ΅Π½ΠΈΡΡ ΡΠΎΡΠΊΡ Π²Ρ ΠΎΠ΄Π° (ΠΎΠΏΡΠΈΡ -e) Π½Π° _my_start.
$ as -o hello.o hello.s $ ld -e _my_start -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello -lc hello.o
$ as -o hello.o hello.s $ ld -e _my_start -dynamic-linker /lib/ld-musl-x86_64.so.1 -o hello -lc hello.o
Π‘Ρ ΠΎΠ΄Ρ Π½Π΅ ΡΠΌΠΎΠ³ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ crt:
$ as -o hello.o hello.s $ ld -e _my_start -dynamic-linker /usr/libexec/ld.so -o hello /usr/lib/crtbegin.o -L/usr/lib -lc hello.o
ΠΠ΅Π· /usr/lib/crtbegin.o ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ELF ΡΠ°ΠΉΠ» hello ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ, Π½ΠΎ Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ.
ΠΠΎΡΠ»Π΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΡΡΠΎΠΉ Π·Π°ΠΌΠ΅ΡΠΊΠΈ ΡΠΎ ΠΌΠ½ΠΎΠΉ ΡΠ²ΡΠ·Π°Π»ΡΡ ΠΎΠ±ΠΈΡΠ°ΡΠ΅Π»Ρ Π΄ΠΎΠΌΠΈΠΊΠ° Π½Π° Π΄Π΅ΡΠ΅Π²Π΅:
ΠΡΠΊΡΠ΅Π½Π½Π΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ ΡΠ΅Π±Π΅, Π½Π΅ΡΠ°Π²Π½ΠΎΠ΄ΡΡΠ½ΡΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ! ΠΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ Π½Π° OpenBSD ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΡΠ΅ΠΊΡΠΈΡ `.note.openbsd.ident`. Π Π΅Ρ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΡΠΎΠ±ΡΠ°Π½Π½ΡΠΉ ELF ΡΠ°ΠΉΠ» Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ.
ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π»ΠΈΡΡΠΈΠ½Π³ Π½Π° GNU'ΡΠΎΠΌ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ Π΄Π»Ρ OpenBSD Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
.global _my_start .extern write, exit .section ".note.openbsd.ident", "a" .p2align 2 .long 8,4,1 .ascii "OpenBSD\0" .long 0 .section .rodata message: .ascii "Hello, world!\n" .section .text _my_start: mov $1, %rdi /* STDOUT */ lea message(%rip), %rsi mov $14, %rdx call write xor %rdi, %rdi call exit
Π ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ Π»ΠΈΡΡΠΈΠ½Π³ (hello.s) Π² ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ELF hello Π½Π° OpenBSD ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
$ as -o hello.o hello.s $ ld -e _my_start -dynamic-linker /usr/libexec/ld.so -o hello -L/usr/lib -lc hello.o
ΠΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠΎ ΡΠ±ΠΎΡΠΊΠΎΠΉ Ρ crtbegin.o ELF "ΠΏΠΎΡ ΡΠ΄Π΅Π»" Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π½Π° Π΄Π²Π° ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡΠ°.
Π‘ΡΡΠ»ΠΊΠΈ ΠΏΠΎ ΡΠ΅ΠΌΠ΅:
Assembly language on OpenBSD (amd64 && arm64)
C ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ OpenBSD: