commit 0d5c96955f59b6fb70627e1304cf72616bbf6a15 from: Aleksey Ryndin date: Mon Nov 11 13:48:04 2024 UTC Add: append /esoteric/gnu_as_hello_world.gmi commit - e008882e1590c00a8d1686e19bef3402ccddf393 commit + 0d5c96955f59b6fb70627e1304cf72616bbf6a15 blob - 54a8d14bd20e6545bbde566fcfe4c31836734882 blob + c453429fbbeed412d8f5c7f7c3ba524d005eea5f --- capsule/atom.xml +++ capsule/atom.xml @@ -8,12 +8,12 @@ continue continue@to.any-key.press - 2024-11-08T22:01:23.392061+00:00 + 2024-11-11T13:37:14.122287+00:00 gemini://any-key.press/esoteric/gnu_as_hello_world.gmi Динамически скомпонованный "Hello, world!" на GNU ассемблере x86_64 (amd64) - 2024-11-08T22:01:23.392061+00:00 + 2024-11-11T13:37:14.122287+00:00 gemini://any-key.press/readed/Compost_Ferment.gmi blob - 5ec511582dc21c5d0a141b551af774adcfecb562 blob + fa382a2a320de0cf405d98cf848b7da12a465248 --- capsule/esoteric/gnu_as_hello_world.gmi +++ capsule/esoteric/gnu_as_hello_world.gmi @@ -77,3 +77,50 @@ $ as -o hello.o hello.s && ld -e _my_start -dynamic-li ``` Без /usr/lib/crtbegin.o результирующий ELF файл hello собирается, но не запускается. + +#### Правильный вариант для OpenBSD (добавлено 2024-11-11) + +После публикации этой заметки со мной связался обитатель домика на дереве: + +=> gemini://domik.dubro.ru Домик на дереве + +Искренне спасибо тебе, неравнодушный человек! Оказалось, что на 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 "похудел" более чем на два килобайта. + +Ссылки по теме: +=> https://astharoshe.net/2020-06-28-Hello_assembler.html Hello assembler! +=> https://nechtan.io/articles/openbsd_assembly/ Assembly language on OpenBSD (amd64 && arm64)