2017-05-04 7 views
1

私はLLVMで遊んでおり、JITを使用しようとすると問題が発生します。私はコンパイラをビルドすることができました。コンパイルされ、リンクされ、正しく実行されます(私のおもちゃプログラムをコンパイルします)。しかし、JITをビルドしようとすると失敗します。llvm:dyld:シンボルが見つかりません:__ZN4llvm11RuntimeDyld13MemoryManager6anchorEv

dyld: Symbol not found: __ZN4llvm11RuntimeDyld13MemoryManager6anchorEv 
    Referenced from: /Users/gruszczy/Projects/shwifty/./bazel-bin/_solib_darwin//liblibjit.so 
    Expected in: flat namespace 
in /Users/gruszczy/Projects/shwifty/./bazel-bin/_solib_darwin//liblibjit.so 
Abort trap: 6 

私はこれらが私のビルドルールです、すべてを構築するためにBazelを使用します。それからかどうかを確認するための方法を実行し、それをJIT(私はテストでIRを生成

new_local_repository(
    name = "llvm", 
    path = "/opt/local/libexec/llvm-4.0", 
    build_file= "llvm.BUILD") 

cc_library(
    name = "main", 
    srcs = glob(["lib/*.a"]), 
    hdrs = glob(["include/**/*.*"]), 
    visibility = ["//visibility:public"], 
    copts = ["-Iexternal/llvm/include"], 
) 

私はテストでJITを使用出来た)。

cc_library(
    name = "jit", 
    srcs = ["jit.cc"], 
    hdrs = ["jit.h"], 
    deps = [ 
     ":ast", 
     ":common", 
     "@llvm//:main" 
    ], 
    copts = GENERAL_COPTS) 

cc_test(
    name = "codegen_test", 
    srcs = ["codegen_test.cc"], 
    deps = [ 
     ":ast", 
     ":jit", 
     ":lexer", 
     ":parser", 
     ":codegen", 
     "@gtest//:main", 
     "@llvm//:main" 
    ], 
    copts = TEST_COPTS, 
    data = [":examples"], 
    size = "small" 
) 

私が紛失している可能性のあることはありますか?

+0

brew(Mac OS)によってインストールされたLLVMバージョンでは、このライブラリは 'libLLVMRuntimeDyld.a'と呼ばれます。 LLVMの配布に応じて、プログラムにリンクする必要があります。あなたのディストリビューションでは、静的ライブラリ '.a'ではなく動的ライブラリ' dylib'があります。 –

+0

'/ opt/local/libexec/llvm-4.0/lib/libLLVMRuntimeDyld.a'にはこのライブラリがあり、作成するllvmライブラリに含める必要があります。私が追加する必要があるいくつかの追加のフラグはありますか? – gruszczy

+0

あなたのコードは正確には分かりませんが、そのシンボルがない理由の1つです: '__ZN4llvm11RuntimeDyld13MemoryManager6anchorEv'は、このライブラリのすべてのシンボルを' -force_load'にリンカーに伝える必要があるかもしれません。 JITコードからのみ使用してください。 –

答えて

2

Bazelはデフォルトでバイナリを静的にリンクしていますが、動的にテストします。テストコードを変更すると、アプリケーション全体ではなく、テストの再構築がトリガされるため、テストコードリファクタのループが高速になります。 codegen_testターゲットにlinkstatic = 1を設定することで無効にすることができます。

共有ライブラリとしてビルドされたときにシンボルがcodegen_testに存在しない理由については、はるかに疑問であり、プロジェクト固有の情報がもっと必要になります。しかし、考えられる解決策は、VMRuntimeDyld.aVMMCJit.aを生成するターゲットをalwayslink = 1とマークすることです。

完全については、link to an issue you reported on bazelをご覧ください。

関連する問題