Iperf: La configuración no genera ejecutables vinculados estáticamente

Creado en 14 ago. 2017  ·  12Comentarios  ·  Fuente: esnet/iperf

Contexto

  • Versión de iperf3:
    3.2

  • Hardware:
    x86_64

  • Sistema operativo (y distribución, si corresponde):
    Compilación cruzada para ARM en Ubuntu

Informe de error

  • Comportamiento esperado
    Crea un ejecutable vinculado estáticamente

  • Comportamiento real
    Crea un ejecutable con bibliotecas vinculadas dinámicamente

doru @ doru-N551JK : ~ / Escritorio / iperf $ salida de archivo / bin / iperf3
output / bin / iperf3: ELF 32-bit LSB ejecutable, ARM, EABI5 versión 1 (SYSV), enlazado dinámicamente (usa bibliotecas compartidas), para GNU / Linux 2.6.32, BuildID [sha1] = 6d84258ed9cbe40710234da5f5b1cf8244d4a365, no despojado

  • Pasos para reproducir
    clonar la rama maestra

aplique este parche: https://github.com/esnet/iperf/pull/631/commits/423a2ec12bf969cb3df93a34f50330837bc6d707

configurar

./configure --without-openssl --host = arm-none-linux-gnueabi CC = arm-linux-gnueabi-gcc LD = arm-linux-gnueabi-ld CXX = arm-linux-gnueabi-g ++ CFLAGS = -static CXXFLAGS = -static --enable-static --disable-shared --prefix = / home / doru / Desktop / iperf3 / output

  • Solución posible

Si construyo iperf2 (no iperf3) siguiendo los pasos anteriores, el resultado es un ejecutable vinculado estáticamente:
doru @ doru-N551JK : ~ / Escritorio / iperf-2.0.5 / salida / bin $ archivo iperf
iperf: ejecutable ELF LSB de 32 bits, ARM, EABI5 versión 1 (SYSV), enlazado estáticamente, para GNU / Linux 2.6.32, BuildID [sha1] = 631918d87fb90840809bb5e5aa5b3d613bf1a775, no despojado

La configuración debe revisarse.

bug

Comentario más útil

Quizás una mejor solución es establecer LDFLAGS=--static cuando se ejecuta configure . Tenga en cuenta el menos adicional .
Por ejemplo:

configure "LDFLAGS=--static" --disable-shared 

Esto crea un ejecutable estático, sin embargo, se produce la siguiente advertencia:

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

Todos 12 comentarios

Confirmo que esto es un problema (probado en CentOS 7 y FreeBSD 11, ambos en compilación nativa y no es necesario para la construcción cruzada en otra plataforma), pero todavía no sé por qué. No probamos esta función de configuración muy a menudo, pero pensé que la había visto funcionar en algún momento del pasado. Me doy cuenta de que, por alguna razón, nunca hacemos un LT_INIT en configure.ac pero no me queda claro si esto es un factor o no.

Tenga en cuenta que iperf2 e iperf3 son programas completamente separados con diferentes infraestructuras de construcción.

Además, supongo que esto realmente tiene algo que ver con libtool, que no es realmente mi especialidad, por lo que si alguien tiene habilidades con libtool, se agradecería enormemente su ayuda.

está bien. Revisé esto un poco en algunas VM de CentOS 7. Volví a aprender que --enable-static --disable-shared solo significa que las bibliotecas compartidas no se compilarán (en este caso libiperf.so ). CFLAGS=-static intenta hacer un enlace estático, pero requiere que se instale la biblioteca C estática en libc-static RPM. Además, el soporte SCTP puede romper la compilación en esta plataforma, porque hasta donde puedo decir, no hay paquetes lksctp-* en CentOS 7 que incluyan bibliotecas estáticas (solo bibliotecas dinámicas).

Todo esto significa que también estoy teniendo problemas para construir un ejecutable iperf3 vinculado estáticamente, pero no se debe a nada en iperf3.

De hecho, este es un problema con libtool que se ha debatido durante más de 5 años. Ver CRÍTICO: libtool hace imposible la vinculación estática .

No sé cuál es la mejor manera de solucionarlo en iperf . Por el momento, solo puedo sugerir una solución.

Para construir iperf3 estáticamente después de ejecutar configure reemplazar
en src/Makefile en las líneas 155-157

iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(iperf3_CFLAGS) $(CFLAGS) \
        $(iperf3_LDFLAGS) $(LDFLAGS) -o $@

con

iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) -all-static $(iperf3_CFLAGS) $(CFLAGS) \
        $(iperf3_LDFLAGS) $(LDFLAGS) -o $@

Es decir, inserte -all-static inmediatamente después de $(CCLD) .

El problema es que libtool trata la opción -static dada al compilador como su propio MODE-ARG y la elimina de la línea de comandos del compilador.

Quizás una mejor solución es establecer LDFLAGS=--static cuando se ejecuta configure . Tenga en cuenta el menos adicional .
Por ejemplo:

configure "LDFLAGS=--static" --disable-shared 

Esto crea un ejecutable estático, sin embargo, se produce la siguiente advertencia:

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

@ d1mach : Gracias por la información y la solución ... ¡eso es bastante interesante!

Esa solución me funcionó bien compilando de forma nativa en CentOS 7 (x86_64). Tenía que tener una máquina con glibc-static instalada, pero ninguna de las cosas lksctp-* . Además, no compilé con OpenSSL (la máquina virtual de prueba que estaba usando no tenía openssl-devel ).

No estoy seguro de cómo funcionaría esto en un entorno de compilación cruzada ... @ doru91 , ¿cree que esta solución podría ayudarlo?

La solución está bien para mí.

¡Muchas gracias!

Probablemente necesite escribir esto para las preguntas frecuentes ... Apuesto a que no eres la única persona que quiere / necesita construir un ejecutable estático. Manteniendo este problema abierto con optimismo para recordarme que lo haga.

Se agregó la entrada de preguntas frecuentes en 835ec5f, cerrando. ¡Gracias a todos por la información y la discusión!

@ d1mach muchas gracias. Tengo un gran problema con el problema. Tu respuesta me funciona bien.

@ d1mach Aquí

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Surendraknatarajan picture Surendraknatarajan  ·  9Comentarios

JodieChuang picture JodieChuang  ·  5Comentarios

cypherstream picture cypherstream  ·  6Comentarios

fl4w picture fl4w  ·  5Comentarios

KevinJosephMorin picture KevinJosephMorin  ·  5Comentarios