Самый простой способ - это скомпилировать код C в объектные файлы (gcc -c
, чтобы получить несколько *.o
файлов) и затем связать их напрямую с компоновщиком (ld
). Вам нужно будет связать ваши объектные файлы с несколькими дополнительными объектными файлами, такими как /usr/lib/crt1.o
, чтобы получить работающий исполняемый файл (между точкой входа, видимой ядром, и функцией main()
, есть немного работа, которую нужно сделать). Чтобы узнать, с чем связываться, попробуйте установить связь с glibc, используя gcc -v
: это должно показать вам, что обычно входит в исполняемый файл.
Вы обнаружите, что gcc генерирует код, который может иметь некоторые зависимости от нескольких скрытых функций. Большинство из них находятся в libgcc.a
. Также могут быть скрытые вызовы memcpy()
, memmove()
, memset()
и memcmp()
, которые находятся в libc, поэтому вам, возможно, придется предоставить свои собственные версии (что не сложно, по крайней мере, пока вы не слишком требовательны к производительности).
Вещи могут иногда становиться понятнее, если вы посмотрите на произведенную сборку (используйте флаг -S
).