web-dev-qa-db-ja.com

getaddrinfoを使用する静的にリンクされたバイナリを作成しますか?

ヘッダーnetdb.hを含めましたが、getaddrinfoが含まれていますが、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が作成するものよりもはるかに小さかった。

29

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

21
bdonlan

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

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

6
zhanxw

特定の機能は、実行時に物事を解決するためにダイナミックローダーに依存していると思います。静的リンクは残念ながら実用的ではなくなりました http://people.redhat.com/drepper/no_static_linking.html

2
pixelbeat