Versão do iperf3:
3,2
Hardware:
x86_64
Sistema operacional (e distribuição, se houver):
Compilação cruzada para ARM no Ubuntu
Comportamento esperado
Constrói um executável estaticamente vinculado
Comportamento Real
Constrói um executável com bibliotecas vinculadas dinamicamente
doru @ doru-N551JK : ~ / Desktop / iperf $ file output / bin / iperf3
output / bin / iperf3: ELF LSB de 32 bits executável, ARM, EABI5 versão 1 (SYSV), vinculado dinamicamente (usa libs compartilhadas), para GNU / Linux 2.6.32, BuildID [sha1] = 6d84258ed9cbe40710234da5f5b1cf8244d4a365, não removido
aplique este patch: 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
Se eu construir iperf2 (não iperf3) usando as etapas acima, resultará em um executável vinculado estaticamente:
doru @ doru-N551JK : ~ / Desktop / iperf-2.0.5 / output / bin $ file iperf
iperf: ELF executável LSB de 32 bits, ARM, EABI5 versão 1 (SYSV), estaticamente vinculado, para GNU / Linux 2.6.32, BuildID [sha1] = 631918d87fb90840809bb5e5aa5b3d613bf1a775, não removido
A configuração deve ser revisada.
Confirmo que isso é um problema (testado no CentOS 7 e FreeBSD 11, ambos com compilação nativa e não é necessário fazer cross-build para outra plataforma), mas ainda não sei o porquê. Não testamos esse recurso de configuração com muita frequência, mas _achei_ já tê-lo visto funcionando em um ponto no passado. Percebo que, por algum motivo, nunca fazemos um LT_INIT
em configure.ac
mas não está claro para mim se isso é um fator ou não.
Observe que iperf2 e iperf3 são programas completamente separados com diferentes infraestruturas de construção.
Além disso, suponho que isso realmente tenha algo a ver com libtool, que não é realmente minha especialidade, então, se alguém tiver habilidades em libtool, a ajuda seria muito apreciada.
OK. Eu revisitei isso um pouco em algumas VMs do CentOS 7. Eu reaprendi que --enable-static --disable-shared
significa apenas que as bibliotecas compartilhadas não serão construídas (neste caso libiperf.so
). CFLAGS=-static
tenta fazer links estáticos, mas requer que a biblioteca C estática em libc-static
RPM seja instalada. Além disso, o suporte SCTP pode quebrar a construção nesta plataforma, porque até onde eu posso dizer não há lksctp-*
pacotes no CentOS 7 que incluem bibliotecas estáticas (bibliotecas dinâmicas apenas).
Tudo isso significa que também estou tendo problemas para construir um executável iperf3 estaticamente vinculado, mas não é devido a nada no iperf3.
Este é realmente um problema com a libtool que foi discutido por mais de 5 anos. Consulte CRÍTICO: libtool torna impossível a vinculação estática .
Não sei qual é a melhor maneira de consertar em iperf
. No momento, eu poderia sugerir apenas uma solução alternativa.
Para construir iperf3
estaticamente após executar configure
substitua
em src/Makefile
nas linhas 155-157
iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(iperf3_CFLAGS) $(CFLAGS) \
$(iperf3_LDFLAGS) $(LDFLAGS) -o $@
com
iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) -all-static $(iperf3_CFLAGS) $(CFLAGS) \
$(iperf3_LDFLAGS) $(LDFLAGS) -o $@
Isso é inserir -all-static
logo após $(CCLD)
.
O problema é que a libtool trata a opção -static
dada ao compilador como seu próprio MODE-ARG e a remove da linha de comando do compilador.
Talvez uma solução melhor seja definir LDFLAGS=--static
ao executar configure
. Observe o menos extra .
Por exemplo:
configure "LDFLAGS=--static" --disable-shared
Isso cria um executável estático, no entanto, o seguinte aviso é produzido:
warning: Using 'getaddrinfo' in statically linked applications requires at runtime the
shared libraries from the glibc version used for linking
@ d1mach : Obrigado pela informação e solução alternativa ... isso é bastante interessante!
Essa solução alternativa funcionou bem para mim compilando nativamente no CentOS 7 (x86_64). Eu precisava ter uma máquina com glibc-static
instalado, mas nenhuma das coisas de lksctp-*
. Além disso, não construí com OpenSSL (a VM de teste que estava usando não tinha openssl-devel
).
Não tenho certeza de como isso funcionaria em um ambiente de compilação cruzada ... @ doru91 , você acha que esta solução alternativa pode ajudá-lo?
A solução está boa para mim.
Muito obrigado!
Eu provavelmente preciso escrever isso para o FAQ ... Aposto que você não é a única pessoa que quer / precisa construir um executável estático. Mantendo este problema aberto de forma otimista para me lembrar de fazer isso.
Adicionada entrada de FAQ em 835ec5f, fechando. Obrigado a todos pela informação e discussão!
@ d1mach muito obrigado. Eu tenho um grande problema com o problema. Sua resposta funciona bem para mim.
@ d1mach Aqui está um agradecimento do futuro. Esse truque "--static" é o que eu vasculhei na internet em busca de uma solução, sem entender completamente o que estava errado. Isso resolveu o problema e será útil no futuro. Muito apreciado.
Comentários muito úteis
Talvez uma solução melhor seja definir
LDFLAGS=--static
ao executarconfigure
. Observe o menos extra .Por exemplo:
Isso cria um executável estático, no entanto, o seguinte aviso é produzido: