¿Crear un binario enlazado estáticamente que use getaddrinfo?


He incluido el encabezado netdb.h, donde getaddrinfo está incluido, pero gcc emite esta advertencia:

warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

gcc -m32 -static -s -O2 -std=c99 -D_POSIX_C_SOURCE=200112L myprogram.c

¿Cómo puedo compilar estáticamente cualquier archivo que falte ?

Posibles soluciones:

  1. Puede ser que a la instalación de glibc le falte el archivo objeto correspondiente necesario para la compilación estática. Si ese es el caso, crea el archivo objeto correspondiente y enlázalo en la compilación.

  2. Pruebe EGLIBC en lugar de glibc.

  3. Compilé con éxito mi programa con dietlibc que compiló sin ningún error más el binario resultante era mucho más pequeño que lo que hace glibc.

Author: Ralf Stubner, 2010-04-28

3 answers

Glibc utiliza libnss para admitir varios proveedores diferentes de servicios de resolución de direcciones. Desafortunadamente, no puede vincular estáticamente libnss, ya que exactamente qué proveedores carga depende de la configuración del sistema local.

 16
Author: bdonlan,
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-06-21 17:48:51

Encontré una solución: puede usar la biblioteca musl para reemplazar glibc. Para usar musl, puede instalarlo y compilar su software usando musl-gcc, o puede usar una distribución Linux que use musl, por ejemplo Alpine Linux.

En mi caso, para ahorrar tiempo, elegí Alpine Linux para construir mi programa ( https://github.com/zhanxw/rvtests ), ya que no quiero compilar varios compiladores (gcc, g++ y gfortran).

 4
Author: zhanxw,
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-05-16 01:56:33

Creo que ciertas características dependen del cargador dinámico para resolver las cosas en tiempo de ejecución. el enlace estático ya no es práctico desafortunadamente http://people.redhat.com/drepper/no_static_linking.html

 1
Author: pixelbeat,
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-04-27 21:40:04