2010-11-22 16 views
13

私のチームのプロジェクトがどのように開発されたのか、すべての私たちの.oオブジェクトファイルから私たちのアプリケーション用の共有オブジェクトライブラリを生成します。私の仕事は(うまくいけば十分ですが、他の人には使えるほど一般的です)、実行ファイルが最後に作成されてから変更されたオブジェクトファイルだけをリンクすることです。たとえば、.soをビルドするために使用するコマンドラインは次のとおりです。Linux上でgccを使用したインクリメンタルリンク。出来ますか?

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so 

予想どおり動作します。 :)私の目標は、今から変更されたオブジェクトファイルだけにリンクすることができるようにすることです。コマンド例は次のようになります。また、libMySharedLibrary.soに古いオブジェクトファイルを維持しながら、新しいオブジェクトファイルとlibMySharedLibrary.soを更新してしまう

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so 

。実際には、上記のコマンドを使用してlibMySharedLibrary.soを生成すると、ファイルサイズはすべてのオブジェクトファイルが含まれている場合よりもはるかに小さいので、上記のコマンドが私が望んでいないことをほとんど確信できます。

私の研究では、-rオプションと同じリンカのオプションがあります。これはすべてのオブジェクトファイルを1つの大きなオブジェクトファイルにまとめたように見えます。残念ながら、これは私が望むものではないようです。

要するに、最初のリンクの後に変更されたオブジェクトファイルのみをリンクしたいので、将来のリンクのリンク処理が速くなります。これを行う方法はありますか?

編集:私は-i/-rで試したものの例:

コマンド例:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

私はそれを必要とするについて私に叫んでから、それを停止する-nostdlibタグを追加する必要がありました、そして-sharedを削除-rタグで共有オブジェクトが許可されていないためです。

このコマンドは、すべての.oファイルを1つの大きな.oファイルに分割するように見えます。ですから、変更された.oファイルだけで、ここから.oファイルを更新することができれば、それは素晴らしいことです。 AllMyObjects.oが最初に作成された後、私はこのコマンドを試した:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.oしかし、それはまた、非常に小さい(ファイルサイズの)AllMyObjects.oを作成するので、私はおそらくすべてのオブジェクトファイルを持つことができないと仮定しています。私はこれが少し間違っている可能性が高いと感じています。誰でも助言がありますか?前もって感謝します。

+0

リンクフェーズは実際にインクリメンタルビルドを支配していますか?そうでなければ、なぜ気になるのですか? – dmckee

+0

'-i' /' -r'で試したことを私たちに見せてもらえますか?それはあなたが望むオプションだと思っていますが、シンボルの競合に遭遇することを期待しています( 'replace'オプションはないと考えています)。 –

+0

リンクフェーズは、ビルドで最も時間のかかる部分ではありません。しかし、これは私のチームリーダーが私に与えた仕事です。私たちはすでに変更されたものだけをコンパイルするだけで良いです。現時点では、変更されたものだけをコンパイルし、毎回すべてのオブジェクトファイルを再リンクします。 –

答えて

6

-shared-rが正しく動作していないようです。私はあなたの古いGCCのバージョンについて懐疑的だったが、それでもUbuntuの10.10で私が同じ見ることができます。残念ながら

$ ld -shared -r 
/usr/bin/ld.bfd.real: -r and -shared may not be used together 

、あなたは絶対に共有オブジェクトが必要な場合はデッドエンドに達したことを意味します。 binutilsリンカーは単にそれを実装していません。

静的ライブラリがオプションの場合は、単にarユーティリティで簡単に操作できるアーカイブです。

それ以外の場合は、別のリンカーやコンパイラスイートを参照する必要があります。あなたがこの機能を見つけることは保証できませんが、エキゾチックなようです。

+0

迅速な対応をありがとうございます。私は間違いなく私のチームリーダーと話し、静的ライブラリを使うことが選択肢になるかどうかを見ていきます。私の研究でも、私はgoogleでIan Lance Taylorによって開発された "gold"という別のリンカーを発見しました。それは2008年3月にbinutilsに追加されました。私もこれを調べるかもしれません。私はデフォルトのリンカーを使ってこれを行う方法があることを期待していましたが、そのようには見えません。再度、あなたの助けをありがとう! –

+3

私は 'gold'をインストールしたようですが、' gold -shared -r'は同じ結果を出します。 –

+0

もちろん、それは事実だろう。 :)あなたの助けをもう一度ありがとう。 –

3

アーカイブ/静的ライブラリを使用した後の動作を並べ替えることができますが、最初のリンクには同じ時間がかかります。

アーカイブファイルを使用する:私が言ったように

# Initially create the archive 
ar r libmylib.a <all object files> 

# Create your shared object (re-use this line after libmylib.a is updated) 
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so  

# Update the archive file 
ar r libmylib.a updated1.o updated2.o 

が、それはまだそれが前に行ったように、実際に.soをリンクするために同じ時間がかかります。

関連する問題