commit - eae34170c261c4a0f231ae82e21a062c7c769dc7
commit + 02b8dcff9045f0e3772ec71afaf5e90b1a0ae9cf
blob - 25bbca798d9e4d5cfd75acc8667a5429547fdf36
blob + 5ec511582dc21c5d0a141b551af774adcfecb562
--- capsule/esoteric/gnu_as_hello_world.gmi
+++ capsule/esoteric/gnu_as_hello_world.gmi
```
$ 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.
+
+* Debian
+
+```
+$ as -o hello.o hello.s && ld -e _my_start -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello -lc hello.o
+```
+
+* Alpine
+
+```
+$ 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 собирается, но не запускается.