1

私は次のようなビルドシステムでldを呼び出すCプロジェクトで作業しています。

ld --allow-multiple-definition --architecture mips -EB --relocatable a.o b.o c.o -o mylib.a a.o b.o c.o

しかし、このコマンドラインのサイズ(必要なすべてのオブジェクトファイルを含む約32,000文字とcygwinの使用)に問題が発生したため、いくつかの変更を検討し始めました。それらの1つは、同じオブジェクトへの2番目の参照を削除することでした。このような:

ld --allow-multiple-definition --architecture mips -EB --relocatable a.o b.o c.o -o mylib.a

しかし、これは物事を壊しました。私はいたるところにたくさんの未定義の参照を取得します。

なぜこれが起こったのですか?両方の呼び出しの違いは何ですか?私はldのドキュメントを読んでいますが、これまでのところ良くありません。

ボーナス

運が良ければ、古いバージョンにはそのようなことを処理するための--start-groupobjs.o-- end -groupオプションがあるかもしれません。

4

1 に答える 1

0

一般に、ライブラリがライブラリでX定義されたシンボルに依存している場合は、に提供されるライブラリのリストの前に表示される必要があります。オブジェクトファイルの名前を2回指定することで、これを回避できるようです。このように、各ペアはリストにとして表示され、オブジェクト内の依存関係に関係なくリンクします。時々あなたは周期的な参照を持っています。次に、オブジェクトをのリストに2回配置する必要があります。YXYld{X, Y}{Y, X}ld

通常、注文が正しくなるまで、注文をいじってみてください。ただし、32-Kコマンドラインでは不可能なようです。私はここでそれを読み、正しい順序を自動的に決定するのlordertsort役立ちますが、これらのツールを使用したことがないため、正しいか間違っているかはわかりません。

于 2012-06-22T15:29:09.217 に答える