πŸ’Ύ 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

View Raw

More Information

-=-=-=-=-=-=-

ДинамичСский "Hello, world!" Π½Π° GNU ассСмблСрС x86_64 (amd64)

Понадобилась ΠΌΠ½Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-Π·Π°Π³Π»ΡƒΡˆΠΊΠ°, выводящая "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

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΡ‹ΠΉ ΠΏΡƒΡ‚ΡŒ (Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ 2024-11-09)

Для Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ 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

OpenBSD

Π‘Ρ…ΠΎΠ΄Ρƒ Π½Π΅ смог ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ 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 (Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ 2024-11-11)

ПослС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ со ΠΌΠ½ΠΎΠΉ связался ΠΎΠ±ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠΌΠΈΠΊΠ° Π½Π° Π΄Π΅Ρ€Π΅Π²Π΅:

Π”ΠΎΠΌΠΈΠΊ Π½Π° Π΄Π΅Ρ€Π΅Π²Π΅

Π˜ΡΠΊΡ€Π΅Π½Π½Π΅ спасибо Ρ‚Π΅Π±Π΅, Π½Π΅Ρ€Π°Π²Π½ΠΎΠ΄ΡƒΡˆΠ½Ρ‹ΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ! Оказалось, Ρ‡Ρ‚ΠΎ Π½Π° 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 "ΠΏΠΎΡ…ΡƒΠ΄Π΅Π»" Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° Π΄Π²Π° ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚Π°.

Бсылки ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅:

Hello assembler!

Assembly language on OpenBSD (amd64 && arm64)

C исходном ΠΊΠΎΠ΄Π΅ OpenBSD:

os-note-elf.h

crtbegin.c (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ os-note-elf.h)