commit d16df18ad08ef14d266d6f205f87f7783845916f from: Aleksey Ryndin date: Tue Nov 12 08:55:34 2024 UTC Fix: esoteric/gnu_as_hello_world.gmi formatting commit - 0d5c96955f59b6fb70627e1304cf72616bbf6a15 commit + d16df18ad08ef14d266d6f205f87f7783845916f blob - fa382a2a320de0cf405d98cf848b7da12a465248 blob + 3dd27e9235eed6f88fb86e6f656762362d5c03f7 --- capsule/esoteric/gnu_as_hello_world.gmi +++ capsule/esoteric/gnu_as_hello_world.gmi @@ -26,7 +26,8 @@ main: А с другой я никогда "руками" (ну точнее с помощью ld) не собирал работоспособные динамически скомпонованные ELF'ы. Оказалось это тот ещё геморрой с указанием crt и интерпретатора-компоновщика на разных платформах: Debian, Alpine и OpenBSD. Плюнул и для кросс-платформенной сборки использую cc (содержимое hello.s приведено в ассемблерном листинге выше): ``` -$ as -o hello.o hello.s && cc -l c -o hello hello.o +$ as -o hello.o hello.s +$ cc -l c -o hello hello.o ``` ## Платформозависимый путь (добавлено 2024-11-09) @@ -59,13 +60,15 @@ _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 +$ 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 +$ 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 @@ -73,7 +76,8 @@ $ as -o hello.o hello.s && ld -e _my_start -dynamic-li Сходу не смог полностью избавиться от 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 +$ 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 собирается, но не запускается. @@ -116,7 +120,8 @@ _my_start: А собирается такой листинг (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 +$ 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 "похудел" более чем на два килобайта. @@ -124,3 +129,7 @@ as -o hello.o hello.s && ld -e _my_start -dynamic-link Ссылки по теме: => https://astharoshe.net/2020-06-28-Hello_assembler.html Hello assembler! => https://nechtan.io/articles/openbsd_assembly/ Assembly language on OpenBSD (amd64 && arm64) + +C исходном коде OpenBSD: +=> https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/csu/os-note-elf.h?rev=1.5 os-note-elf.h +=> https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/csu/crtbegin.c?rev=1.26 crtbegin.c (включает os-note-elf.h)