Iperf: A configuração não gera executável vinculado estaticamente

Criado em 14 ago. 2017  ·  12Comentários  ·  Fonte: esnet/iperf

Contexto

  • Versão do iperf3:
    3,2

  • Hardware:
    x86_64

  • Sistema operacional (e distribuição, se houver):
    Compilação cruzada para ARM no Ubuntu

Relatório de erro

  • 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

  • Passos para reproduzir
    clonar o ramo mestre

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

  • Solução possível

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.

bug

Comentários muito úteis

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

Todos 12 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações