Compilação estática do wget

1

Eu baixei o código-fonte do wget e tentei uma compilação estática. Estes são os passos que segui:

./configure LDFLAGS=-static

No final, a saída mostrada é a seguinte:

  Version:           1.17
  Host OS:           linux-gnu
  Install prefix:    /usr/local
  Compiler:          gcc
  CFlags:              -I/usr/include/p11-kit-1   -DHAVE_LIBGNUTLS   -DNDEBUG  
  LDFlags:           -static
  Libs:              -lpcre   -lgnutls   -lz   
  SSL:               gnutls
  Zlib:              yes
  PSL:               no
  Digest:            yes
  NTLM:              auto
  OPIE:              yes
  Debugging:         yes
  Assertions:        no
  Valgrind:          Valgrind testing not enabled
  Metalink:          no
  GPGME:             no

Então usei make . Isso lança uma longa lista de erros. Aqui está um trecho:

init.o: In function 'home_dir':
init.c:(.text+0x2bc): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
host.o: In function 'getaddrinfo_with_timeout_callback':
host.c:(.text+0x495): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libgnutls.a(gnutls_mpi.o): In function '_gnutls_x509_read_int':
(.text+0x6af): undefined reference to 'asn1_read_value'
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libgnutls.a(gnutls_mpi.o): In function '_gnutls_x509_read_int':
.
.
(.text+0x1a7a): undefined reference to 'pthread_mutex_lock'
/usr/lib/gcc/i686-linux-gnu/4.8/libgcc_eh.a(unwind-dw2-fde-dip.o): In function '_Unwind_Find_FDE':
(.text+0x1ac9): undefined reference to 'pthread_mutex_unlock'
collect2: error: ld returned 1 exit status
make[3]: *** [wget] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Alguém já enfrentou um problema semelhante? Se sim, por favor poste uma solução. Agradecemos antecipadamente

    
por Nick Miller 17.11.2015 / 10:15

1 resposta

2

Para a vinculação estática, ld não fará o trabalho de pesquisa automática de dependências para wget , como faz magicamente para objetos compartilhados. Alguns scripts tentam fazer essa lista para você, outros não. Você atingiu o último caso.

Você precisa criar a lista de bibliotecas e suas dependências por conta própria.

Se você ainda não sabe qual é a lista completa de deps para seu binário wget estático, primeiro é necessário criá-lo como normal (compartilhado) e, em seguida, obter essa lista com ldd /path/to/wget , onde /path/to/wget é o seu binário construído do wget (ele pode ser encontrado dentro da árvore fonte, geralmente algo como src/wget )

Você precisará obter todas as versões estáticas das bibliotecas compartilhadas. Eles geralmente estão contidos nos pacotes -dev ou devel que sua distribuição fornece.

Cada biblioteca na lista deve ser reorganizada ou anexada duas ou mais vezes, porque ld não tenta pesquisar todos os arquivos estáticos em busca de símbolos e erros específicos. Então, o seu libgnutls.a provavelmente depende do libtasn1.a para os símbolos asn1_ *. Então você precisa anexar isto à linha de comando: -lgnutls -ltasn1 . Se mais uma biblioteca depender do libtasn1.a, você precisará anexá-la novamente à linha de comando do link.

Os símbolos indefinidos podem ser resolvidos procurando na lista de símbolos da biblioteca estática com nm /usr/lib/lib.a . Ou encontrar essa biblioteca em determinado diretório com fgrep -l symbol_name /usr/lib/*.a . Observe que essa pesquisa (com fgrep) mostrará as duas bibliotecas que exigem e fornecem esse símbolo, portanto, é apenas um teste rápido.

As bibliotecas podem ser anexadas com LIBS= variable a configure script: LIBS="-lgnutls -ltasn1" .

    
por 17.11.2015 / 16:13