La manera más simple es compilar el código C para archivos de objeto (gcc -c
para obtener algunos archivos *.o
) y luego vincularlos directamente con el vinculador (ld
). Deberá vincular los archivos de objeto con unos pocos archivos de objetos adicionales, como /usr/lib/crt1.o
, para obtener un ejecutable que funcione (entre el punto de entrada, como lo ve el núcleo, y la función main()
, hay un poco de trabajo por hacer) . Para saber con qué vincular, intente vincular con glibc, usando gcc -v
: esto debería mostrarle lo que normalmente entra en el ejecutable.
Encontrará que gcc genera código que puede tener algunas dependencias con algunas funciones ocultas. La mayoría de ellos están en libgcc.a
. También puede haber llamadas ocultas a memcpy()
, memmove()
, memset()
y memcmp()
, que están en la libc, por lo que es posible que deba proporcionar sus propias versiones (lo cual no es difícil, al menos mientras no sea demasiado quisquilloso con el rendimiento).
Las cosas pueden obtener más claras a veces si nos fijamos en el conjunto producido (utilice la bandera -S
).
'-nostdlib' debería hacerlo, lo que versión de la plataforma/compilador está usando? –
"no ayuda", ya que no deshabilitó la biblioteca, o no se pudo compilar nada con esa marca? –
Probablemente también quiera -nostartupfiles. –