Commit Diff


commit - eae34170c261c4a0f231ae82e21a062c7c769dc7
commit + 02b8dcff9045f0e3772ec71afaf5e90b1a0ae9cf
blob - 25bbca798d9e4d5cfd75acc8667a5429547fdf36
blob + 5ec511582dc21c5d0a141b551af774adcfecb562
--- capsule/esoteric/gnu_as_hello_world.gmi
+++ capsule/esoteric/gnu_as_hello_world.gmi
@@ -28,3 +28,52 @@ main:
 ```
 $ 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 собирается, но не запускается.