35

が含まれているヘッダーを含めましたnetdb.hgetaddrinfo、gcc は次の警告を発行します。

warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

gcc -m32 -static -s -O2 -std=c99 -D_POSIX_C_SOURCE=200112L myprogram.c

不足しているファイルを静的にコンパイルするにはどうすればよいですか?

可能な解決策:

  1. glibc のインストールに、静的コンパイルに必要な対応するオブジェクト ファイルがない可能性があります。その場合は、対応するオブジェクト ファイルを作成し、コンパイル時にリンクします。

  2. glibc の代わりに EGLIBC を試してください。

  3. 私はプログラムをdietlibcで正常にコンパイルしました。これはエラーなしでコンパイルされ、結果のバイナリはglibcが作成するものよりもはるかに小さくなりました。

4

3 に答える 3

25

glibcは、libnssを使用して、アドレス解決サービス用のさまざまなプロバイダーをサポートしています。残念ながら、libnssを静的にリンクすることはできません。これは、libnssがロードするプロバイダーは、ローカルシステムの構成によって異なるためです。

于 2010-06-21T17:48:51.713 に答える
7

私は解決策を見つけました.muslライブラリを使用してglibcを置き換えることができます. musl を使用するには、musl-gcc を使用してインストールしてソフトウェアをビルドするか、Alpine Linux などの musl を使用する Linux ディストリビューションを使用できます。

私の場合、時間を節約するために、複数のコンパイラ (gcc、g++、および gfortran) をビルドしたくないため、Alpine Linux を選択してプログラム ( https://github.com/zhanxw/rvtests ) をビルドしました。

于 2016-05-16T01:56:33.827 に答える
2

特定の機能は、実行時に問題を解決するために動的ローダーに依存していると思います。残念ながら、静的リンクはもはや実用的ではありませんhttp://people.redhat.com/drepper/no_static_linking.html

于 2010-04-27T21:40:04.237 に答える