2010-04-27 13 views
23

He incluido el netdb.h cabecera, donde se incluye getaddrinfo, pero los problemas de gcc esta advertencia:Crear un binario estáticamente enlazado que use getaddrinfo?

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 falta?

soluciones posibles:

  1. Podría ser que la instalación de glibc no se encuentra el archivo de objeto correspondiente necesario para la compilación estática. Si ese es el caso, crea el archivo de objeto correspondiente y vincúlalo en la compilación.

  2. Pruebe EGLIBC en lugar de glibc.

  3. He compilado 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.

+2

Haré que sus posibles soluciones sean una respuesta. Entonces puedes aceptar tu propia respuesta. – Lucas

Respuesta

12

glibc utiliza libnss para admitir un número de diferentes proveedores 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.

+4

Mientras tanto, en la versión 2.20 está el indicador '--enable-static-nss' de' configure' que parece haz 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 hacen). –

+0

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

1

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

+0

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

+0

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

3

Encontré una solución: puede usar la biblioteca de 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, p. 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).

+0

¿Conoces una solución para C++? – JC1

+1

Puede usar Alpine Linux para compilar códigos C++. – zhanxw

+0

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

Cuestiones relacionadas