-1

かなり複雑な理由で、個別にコンパイルしてからリンクしたい一連のファイルがありますが、1 つの関数が 2 番目の関数にインラインで配置されるようにします。これは、GCC で異なるフラグを使用してコンパイルしたいためです。それを回避する方法を調べることで問題を解決できることはわかっていますが、これが可能かどうかを知りたいです。

編集1:そうでない場合、「外部」関数を、他のファイルに含めることができるアセンブリの形式にコンパイルすることは可能ですか? はい、クレイジーですがクールでもあります...

ざっと見てみると、これはオプションである可能性があります。自動でコンパイルするのは無理だと思うので、どなたかアセンブルについて教えていただけないでしょうか?基本的なARMアセンブリのみを使用しました。-SGCC のフラグを使用しておもちゃの関数にコンパイルしました。レジスタと変数をリンクするにはどうすればよいですか? それらは常に同じ順序になりますか?この機能は高度に最適化されます。いつ抽出を開始および終了する必要がありますか? .cfi_startproc最初と最後に含める必要があり.cfi_def_cfa 7, 8ますか?#

編集 2: この投稿では、gcc がこのようなリンク時の最適化を行う方法について詳しく説明してい-fltoます。悲しいことに、これはバージョン 4.5 でのみ使用できます。これをコンパイルする必要があるマシンのルート アクセス権がないため、インストールすることもできません。別の可能な解決策は、異なるバージョンの GCC を UNIX マシンのフォルダーにインストールする方法を説明することです。

4

2 に答える 2

1

私が知る限り、少なくとも標準の ld リンカーでは、 gcc はリンク時の最適化(特にインライン化) を行いません (新しいゴールドリンカーが行う可能性がありますが、実際にはそうは思いません)。リンク時の最適化をサポートするLLVMに依存しているため、原則としてClangはそれを実行できるはずです(ただし、質問は gcc spacific のようです)。

ただし、あなたの質問から、コンパイル後にオブジェクトファイルをマージする方法を探しているようです。必ずしも含まれている関数をインライン化する必要はありません。これは複数の方法で実行できます。

  1. ar: eg を使用してそれらを静的ライブラリにアーカイブしますar libfoo.a obj1.o obj2.o
  2. それらを組み合わせて 3 番目の再配置可能オブジェクトにします (ld の --relocatable オプション)。gcc -Wl,--relocatable -o obj3.o obj1.o obj2.o
  3. それらを共有ライブラリに入れます(これには-fPICでオブジェクトをコンパイルする必要があることに注意してください)。gcc -shared -o libfoo.so obj1.o obj2.o
于 2013-02-14T12:04:58.473 に答える
-1

-c オプションを指定してコンパイルすると、一連の .o ファイルを作成したり、.so ファイルを作成したりすることもできます。次に、gcc のリンク フェーズで好きなシーケンスを使用します。

于 2013-02-13T23:58:27.113 に答える