web-dev-qa-db-ja.com

ar / nmとgcc-ar / gcc-nmの違いは何ですか?

arnm、およびranlibは、binutilsパッケージによって提供されます。 gcc-argcc-nm、およびgcc-ranlibは、GCCパッケージによって提供されます。 gcc-argcc-nm、およびgcc-ranlibは、それぞれarnm、およびranlibバイナリの「実質的にラッパー」であるとどこかで読んだことがあります。

gcc-argcc-nmgcc-ranlibarnmranlibの技術的な違いは何ですか? GCCがビルドでこれらのバイナリを提供する理由があるに違いありません。

ユーザーランドパッケージのビルドシステムでは、どちらを使用する必要がありますか?ユーザーランドパッケージのビルドに使用されているツールチェーンがGCCベースである場合、どちらを使用するかは重要ですか(例:argcc-arnmgcc-nm)。

11
Cherry Vanc

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

nmgcc-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年以内-arnmによって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とは別に出荷されるという目的に役立ちます。 arfoo.oおよびbar.oの真のシンボルテーブルをアーカイブに挿入できないため、インスタンスは未定義の参照とのリンケージに失敗します。

9
Mike Kinghan