Compilar sin libc


Quiero compilar mi código C sin el (g)libc. ¿Cómo puedo desactivarlo y qué funciones dependen de él?

He intentado-nostdlib pero no ayuda: El código es compilable y se ejecuta, pero todavía puedo encontrar el nombre del libc en el hexdump de mi ejecutable.

Author: u149796, 2010-03-31

2 answers

Si compila su código con-nostdlib, no podrá llamar a ninguna función de la biblioteca de C (por supuesto), pero tampoco obtendrá el código de arranque normal de C. En particular, el punto de entrada real de un programa en linux no es main(), sino una función llamada _start(). Las bibliotecas estándar normalmente proporcionan una versión de esto que ejecuta algún código de inicialización, luego llama a main().

Intenta compilar esto con gcc-nostdlib:

void _start() {

    /* main body of program: call main(), etc */

    /* exit system call */
    asm("movl $1,%eax;"
        "xorl %ebx,%ebx;"
        "int  $0x80"
    );
}

La función _start() siempre debe terminar con una llamada a exit (u otra llamada al sistema que no regresa como exec). El ejemplo anterior invoca la llamada al sistema directamente con el ensamblado en línea ya que la salida habitual () no está disponible.

 59
Author: ataylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-20 21:48:13

La forma más sencilla es compilar el código C en archivos objeto (gcc -c para obtener algunos archivos *.o) y luego vincularlos directamente con el enlazador (ld). Tendrá que vincular sus archivos objeto con algunos archivos objeto 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é enlazar, intente enlazar con el 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 a 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 el libc, por lo que es posible que tenga que proporcionar sus propias versiones (que no es difícil, al menos mientras no sea demasiado exigente con el rendimiento).

Las cosas podrían ser más claras a veces si miras el ensamblaje producido (usa la bandera -S).

 6
Author: Thomas Pornin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-30 20:44:45