Con un programa como
int main()
{
return 0;
}
- y usted vincula estáticamente, alguna biblioteca en su sistema se vinculará al binario final.
- y vincula dinámicamente, ¿se cargará una biblioteca cuando se ejecute?
En esencia, ¿siempre se requiere una biblioteca incluso para los programas más simples? Si es así, ¿por qué? Pregunto porque pensé que el punto de entrada canónico para cualquier cosa que quiera ejecutarse es en realidad _start (que pensé que estaba en una biblioteca, a saber, glibc). Tal vez no entiendo qué hace realmente _start con respecto a la configuración de las cosas, por lo que cualquier sugerencia allí también sería útil.
Respuesta aceptada:
Si desea escribir su programa en C portátil estándar, necesita, por supuesto, algún tiempo de ejecución que llame al main()
función en primer lugar.
Pero si eso no le importa, puede prescindir de cualquier biblioteca y realizar llamadas al sistema directamente a través del ensamblado en línea. P.ej. para x86-64:
$ cat q.c
#include <sys/syscall.h>
void _start(void){
__asm__( "syscall" : : "D"(0), "a"(SYS_exit) );
}
$ cc -O2 -static -nostdlib -nostartfiles -Wall q.c -o q
$ strace ./q
execve("./q", ["./q"], 0x7fffc72d8d20 /* 39 vars */) = 0
exit(0) = ?
+++ exited with 0 +++
Tienes que hacer al menos una llamada al sistema, a saber, _exit(2)
, a menos que la salida por bloqueo sea aceptable para un "programa más simple", en cuyo caso también servirá un archivo vacío;-):
$ > foo.c
$ cc -static -nostdlib -nostartfiles -Wall foo.c -o ./foo
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
$ ./foo
Segmentation fault
Pensé que el punto de entrada canónico para cualquier cosa que quiera ejecutarse es en realidad _start
no hay nada canónico al respecto; _start
es el nombre predeterminado que usará el enlazador; puede apuntarlo a otra parte con -e sym
opción (-Wl,-e,sym
con gcc
).