2つのGCCコンパイル済み.oオブジェクトファイルを3番目の.oファイルに結合します


84

2つのGCCコンパイル済み.oオブジェクトファイルを3番目の.oファイルに結合するにはどうすればよいですか?

$ gcc -c  a.c -o a.o
$ gcc -c  b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable

ソースファイルにアクセスできる場合、-combineGCCフラグはコンパイル前にソースファイルをマージします。

$ gcc -c -combine a.c b.c -o c.o

ただし、これはソースファイルに対してのみ機能し、GCCは.oこのコマンドの入力としてファイルを受け入れません。

通常、.oリンカの出力を入力として使用できないため、ファイルのリンクは正しく機能しません。結果は共有ライブラリであり、結果の実行可能ファイルに静的にリンクされません。

$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

1
gccには現在-combineオプションがありません。これはgcc4.1.2に存在し、gcc 6.3.0には存在しません(他の誰かがいつ削除されたかを把握できます)。
キーストンプソン

回答:


98

-relocatableまたは-rtoldを渡すと、の入力として適切なオブジェクトが作成されますld

$ ld -relocatable a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable

生成されたファイルは、元の.oファイルと同じタイプです。

$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$ file c.o
c.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

2
逆の操作はできますか?つまり、coからaoとboを生成しますか?
Bert Regelink 2014

7
@BertRegelinkいいえ、一意の逆関数がないため、数学的には、グループを形成しません:P
Alec Teal

7
警告: --relocatable移植性が低いようです。Android NDKに付属のldは、のみを認識し-relocatableます。移植性が必要な場合は、に固執してください-r
マーティンボナーは

3
@matthijs言葉は同じです。違いは1マイナスまたは2です。
マーティンボナーは2017

1
ああ、それを見ませんでした。したがって、Android NDKはとのみを認識-relocatable -r、を認識ません--relocatable。明確にしてくれてありがとう!
Matthijs Kooijman 2017

10

2つ以上の.oファイル(静的ライブラリなど)のアーカイブを作成する場合は、ar次のコマンドを使用します。

ar rvs mylib.a file1.o file2.o

@Lucianしかし、なぜあなたはこれをしたいのですか?静的ライブラリは、.oファイルよりもリンクするのにはるかに便利です。

5
objcopy結果のファイルで実行し、外部から見えないように、ファイルに対してローカルな種類のシンボルを作成する必要があります。ローカライズする必要のあるシンボルの一部は、a.ob.oファイルの間で参照されます。リンカー時にシンボルが見つからないため、個々のファイルをローカライズできません。また、静的アーカイブからシンボルをローカライズすることもできません。
Lucian Adrian Grijincu 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.