llvm:dyld:未找到符号:__ ZN4llvm11RuntimeDyld13MemoryManager6anchorEv

时间:2017-05-04 15:17:52

标签: llvm bazel

我正在玩LLVM,我在尝试使用JIT时遇到了问题。我能够构建一个编译器,它可以编译,链接并且运行正常(它编译我的玩具程序)。但是,当我尝试使用构建JIT时,它会失败。

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构建所有内容,这些是我的构建规则:

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(我在测试中生成IR然后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"
)

我可能遗失的任何建议?

1 个答案:

答案 0 :(得分:2)

混淆的原因是Bazel默认情况下会静态链接二进制文件,但会动态测试。这使得测试代码重构循环更快,因为对测试代码的更改只会触发测试的重建,而不是整个应用程序。可以通过在linkstatic = 1目标上设置codegen_test来停用它。

为什么codegen_test中的符号在构建为共享库时不存在,这是一个更难的问题,需要更多项目特定的信息。但可能的解决方案可能是将VMRuntimeDyld.aVMMCJit.a生成的目标标记为alwayslink = 1

为了完整性,这是link to an issue you reported on bazel