Versión de iperf3:
3.2
Hardware:
x86_64
Sistema operativo (y distribución, si corresponde):
Compilación cruzada para ARM en Ubuntu
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
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
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.
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í
Comentario más útil
Quizás una mejor solución es establecer
LDFLAGS=--static
cuando se ejecutaconfigure
. Tenga en cuenta el menos adicional .Por ejemplo:
Esto crea un ejecutable estático, sin embargo, se produce la siguiente advertencia: