11

私も書いた C++ ライブラリを使用する C++ プロジェクトがあります。すべてをビルドするためにclang ++ 3.3を使用しています。ライブラリ内の各ファイルは次のようにコンパイルされます。

clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc

次に、llvm-link を使用して、すべてのライブラリ *.bc ファイルを 1 つのビット コード ファイルに結合します。

llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc

私はこれをオブジェクト ファイルのアーカイブの作成に似ていると考えていますが、実際の動作に基づいてそれが正しいとは思いません。

次に、上記と同様のコマンドを使用して、プロジェクトのソース ファイルをコンパイルします。次に、llvm-link (再び) を使用して、これらを結合し、ライブラリ ビット コード ファイルと一緒に、このような単一のビット コード ファイルにします。

llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc

次に、app.bc1 をネイティブ オブジェクト ファイルにコンパイルします。

llc -filetype=obj app.bc1 -o app.o

最後に、もう一度 clang++ を使用して、このネイティブ オブジェクト ファイルをリンクします (C++ 標準ライブラリなど、必要な他のネイティブ ライブラリに対してもリンクします)。

clang++ app.o -o app

ただし、アプリケーションのビット コードを llvm-link すると、MyLibrary.bc の内容全体が結果に含まれるように見えます。したがって、最終的なリンクでは、実際には使用していないライブラリ コンポーネントによって行われた参照を解決する必要があります。

私がやりたいことは、MyLibrary.bc からアプリケーションに必要なビット コード ファイルだけを抽出することです。llvm-ar プログラムがあるようですが、それについて読んでも、ここで役立つという印象はありません。ライブラリをllvm-linkの代わりにllvm-arと組み合わせることができると思いましたが、わかりません。必要なのは少しプッシュするだけだと思っています:)

4

1 に答える 1

4

編集:実際にはそれを機能させるのは ar です。

少し遅れましたが、まだ誰かに関連している可能性があります.LLVMプラグインを使用arしてビットコードをリンクします:ld.gold

ar r --plugin /usr/lib64/llvm/LLVMgold.so library.a <files...>
ld.gold --plugin /usr/lib64/llvm/LLVMgold.so -plugin-opt emit-llvm  main.bc library.a

もちろん、LLVMgold.so へのパスは異なる場合があります。このようにして、結果の .bc には必要なシンボルが含まれます。

于 2014-06-21T15:20:12.483 に答える