ar
、nm
、およびranlib
は、binutilsパッケージによって提供されます。 gcc-ar
、gcc-nm
、およびgcc-ranlib
は、GCCパッケージによって提供されます。 gcc-ar
、gcc-nm
、およびgcc-ranlib
は、それぞれar
、nm
、およびranlib
バイナリの「実質的にラッパー」であるとどこかで読んだことがあります。
gcc-ar
、gcc-nm
、gcc-ranlib
とar
、nm
、ranlib
の技術的な違いは何ですか? GCCがビルドでこれらのバイナリを提供する理由があるに違いありません。
ユーザーランドパッケージのビルドシステムでは、どちらを使用する必要がありますか?ユーザーランドパッケージのビルドに使用されているツールチェーンがGCCベースである場合、どちらを使用するかは重要ですか(例:ar
とgcc-ar
、nm
とgcc-nm
)。
gcc-ar
は、GNU ar
のラッパーであり、次のようなコマンドです。
gcc-ar ...
以下と同等です。
ar --plugin=/path/to/liblto_plugin.so ...
私の現在のシステムでは、Ubuntu 17.10、GCC 7.2、それは例えば:
ar --plugin=/usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so
nm
とgcc-nm
の間にも同じ関係があります。
Binutils ar
およびnm
の--plugin
オプションを使用すると、認識しなければならないオブジェクトファイルのデフォルト以外の形式の認識機能/分析機能を動的にロードできます。
共有ライブラリliblto_plugin.so
は、リンク時最適化ビルドで生成および消費されるIR(中間表現)オブジェクトファイルを処理できるライブラリです。
したがって、次のように単純な古いビルドを行う場合:
$ gcc -c main.c foo.c bar.c
$ ar cr libfoobar.a foo.o bar.o
$ gcc -o prog main.o -L. -lfoobar
次に、次のようにリンク時に最適化されたビルドを行います。
$ gcc -flto -c main.c foo.c bar.c
$ gcc-ar cr libfoobar.a foo.o bar.o
$ gcc -flto -o prog main.o -L. -lfoobar
binutils
の最近のリリースでは、どちらが最初だったかわかりません。過去3〜4年以内-ar
とnm
によってliblto_plugin.so
がデフォルトで読み込まれました。だから実際には:
$ gcc -flto -c main.c foo.c bar.c
$ ar cr libfoobar.a foo.o bar.o
$ gcc -flto -o prog main.o -L. -lfoobar
正常に動作します。およびnm foo.o
は正常に動作します。ただし、gcc-*
バージョンは、通常のar
およびnm
がそのデフォルトをサポートしていない可能性があるため、GCCとは別に出荷されるという目的に役立ちます。 ar
はfoo.o
およびbar.o
の真のシンボルテーブルをアーカイブに挿入できないため、インスタンスは未定義の参照とのリンケージに失敗します。