commit 02b8dcff9045f0e3772ec71afaf5e90b1a0ae9cf from: Aleksey Ryndin date: Fri Nov 08 22:02:00 2024 UTC Fix: append /esoteric/gnu_as_hello_world.gmi 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 собирается, но не запускается.