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

3 minutos de lectura

avatar de usuario
Neeladri Vishweswaran

He incluido el encabezado. netdb.hdonde 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?

Soluciones posibles:

  1. Podría ser que a la instalación de glibc le falte el archivo de objeto correspondiente necesario para la compilación estática. Si ese es el caso, cree el archivo de objeto correspondiente y vincúlelo en la compilación.

  2. Pruebe EGLIBC en lugar de glibc.

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

  • Haría que sus posibles soluciones sean una respuesta. Entonces puedes aceptar tu propia respuesta.

    – Lucas

    18 de mayo de 2010 a las 7:53

glibc usa 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.

  • Mientras tanto en la versión 2.20 está el --enable-static-nss Bandera de configure que parece hacer exactamente esto. Tenga en cuenta que la vinculación estática presenta algunas desventajas (consulte la respuesta de @pixelbeat y los comentarios que se le hicieron).

    – Kalle Richter

    20 de septiembre de 2014 a las 18:18


  • Encontré una solución que usa musl en lugar de glibc. Vea mi respuesta a continuación: stackoverflow.com/a/37245653/425758

    – zhanxw

    16 mayo 2016 a las 19:18

Encontré una solución: puede usar la biblioteca musl para reemplazar glibc. Para usar musl, puede instalarlo y construir su software usando musl-gcc, o puede usar una distribución de 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).

  • ¿Conoces una solución para C++?

    – JC1

    12 oct 2017 a las 23:38

  • Gracias. ¿Sabes si los binarios compilados en Alpine son portátiles? Estoy creando un binario para que se ejecute como lambda en Amazon AWS y creo que es muy recomendable compilarlo en CentOS (el sistema operativo utilizado para lambdas).

    – JC1

    13 oct 2017 a las 16:46

  • @JC1 Sí, compilé en Alpine Linux y puedo ejecutarlo en Ubuntu 16.04 y CentOS7.

    – zhanxw

    14/10/2017 a las 18:50

Creo que ciertas características dependen del cargador dinámico para resolver las cosas en tiempo de ejecución. lamentablemente, la vinculación estática ya no es práctica http://people.redhat.com/drepper/no_static_linking.html

  • Creo que depende de lo que tengas que hacer. La compilación estática es una solución válida si la portabilidad binaria es imprescindible.

    – Neeladri Vishweswaran

    7 de mayo de 2010 a las 8:49

  • Bueno, lo anterior menciona que algunas cosas no son posibles si vinculas estáticamente. Tengo algunas notas sobre la compatibilidad binaria aquí: pixelbeat.org/programming/linux_binary_compatibility.html

    – pixelbeat

    7 mayo 2010 a las 13:08

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad