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/wget
src/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"
。