GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿todos los programas en C necesitan cargar una biblioteca?

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 ).


Linux
  1. Cómo depurar programas C en Linux usando gdb

  2. Cómo instalar la biblioteca Ncurses en Linux

  3. Cómo enumerar todos los paquetes instalados en Linux

  4. ¿Por qué necesitamos el archivo .so.1 en Linux?

  5. Desinstalar programas en Linux

Comando de tiempo de actividad en Linux

Cómo ejecutar todos los scripts en un directorio en Linux

Cómo verificar la carga de su servidor en Linux

Cómo instalar la biblioteca Python de PyBrain en Linux

¿Necesita Java? Entonces puedes instalarlo Java en Linux

¿Qué es el promedio de carga en Linux?