wgetの静的コンパイル

wgetの静的コンパイル

wgetのソースコードをダウンロードして静的コンパイルを試みました。私が従ったステップは次のとおりです。

./configure LDFLAGS=-static

表示される最終出力は次のとおりです。

  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

次に、make長いエラーのリストを投げた。以下は抜粋です:

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

同様の問題が発生した人はいますか?その場合は、解決策を投稿してください。事前にありがとう

答え1

静的接続を使用すると、共有オブジェクトのように依存関係は魔法のldように自動的に取得されません。wget一部のスクリプトはこれらのリストを生成しようとしますが、一部はそうではありません。後者の状況に直面しました。

ライブラリのリストとその依存関係を直接作成する必要があります。

静的バイナリの完全なdepsリストが何であるかまだわからない場合は、まずこれを正常にビルド(共有)してから、wgetを使用してwgetビルドバイナリのリストを取得する必要がありますwget(ソースにあります)。ツリー、通常は次のようになります)ldd /path/to/wget/path/to/wgetsrc/wget

共有ライブラリのすべての静的バージョンを入手する必要があります。通常、ディストリビューションに付属する-devまたはdevelパッケージに含まれています。

リスト内の各ライブラリは、ld特定のシンボルとエラーに対してすべての静的アーカイブを取得しようとしないため、複数回並べ替えるか追加する必要があります。したがって、libgnutls.aはlibtasn1.aのasn1_*シンボルによって異なります。その後、コマンドラインに以下を追加する必要があります-lgnutls -ltasn1。 libtasn1.aに依存する他のライブラリがある場合は、それをリンクコマンドラインに再度追加する必要があります。

未定義のシンボルは、を使用して静的ライブラリのシンボルのリストを見ると確認できますnm /usr/lib/lib.a。または一部のディレクトリで使用してくださいfgrep -l symbol_name /usr/lib/*.a。これらの検索(fgrepを使用)は、対応するシンボルを要求して提供する2つのライブラリを表示するため、これは簡単なテストです。

LIBS=ライブラリはconfigureスクリプトに変数を追加できますLIBS="-lgnutls -ltasn1"

関連情報