Commit Diff


commit - e008882e1590c00a8d1686e19bef3402ccddf393
commit + 0d5c96955f59b6fb70627e1304cf72616bbf6a15
blob - 54a8d14bd20e6545bbde566fcfe4c31836734882
blob + c453429fbbeed412d8f5c7f7c3ba524d005eea5f
--- capsule/atom.xml
+++ capsule/atom.xml
@@ -8,12 +8,12 @@
         <name>continue</name>
         <email>continue@to.any-key.press</email>
     </author>
-    <updated>2024-11-08T22:01:23.392061+00:00</updated>
+    <updated>2024-11-11T13:37:14.122287+00:00</updated>
     <entry>
         <id>gemini://any-key.press/esoteric/gnu_as_hello_world.gmi</id>
         <link href="gemini://any-key.press/esoteric/gnu_as_hello_world.gmi" rel="alternate"/>
         <title>Динамически скомпонованный "Hello, world!" на GNU ассемблере x86_64 (amd64)</title>
-        <updated>2024-11-08T22:01:23.392061+00:00</updated>
+        <updated>2024-11-11T13:37:14.122287+00:00</updated>
     </entry>
     <entry>
         <id>gemini://any-key.press/readed/Compost_Ferment.gmi</id>
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)