【问题标题】:Is it possible to link bitcode with llvm-ar archieve into a single bitcode file?是否可以将位码与 llvm-ar 归档链接到单个位码文件中?
【发布时间】:2013-09-29 08:27:22
【问题描述】:

我在 llvm-dev 上阅读了this thread 并面临同样的问题:我无法将 llvm-ar 归档库与其他 bitcode 文件链接到另一个在llvm-link 的帮助下单个位码文件

clang -emit-llvm -g -c -o main.bc main.c
clang -emit-llvm -g -c -o calc.bc calc.c
llvm-ar rcs libcalc.la calc.bc
llvm-link libcalc.la main.bc -o test

问题是一样的:llvm-link抱怨

llvm-link: libcalc.la:1:2: error: expected integer
!<arch>
 ^

而且看了How to link object to libraries with LLVM >= 3.1 ? ( no GNU ld )之后,我也尝试了一个llvm2.9版本的llvm-ld

llvm-ld --disable-opt libcalc.la main.bc -o test

但是libcalc.la没有正确链接到模块中,lli 报告:

LLVM ERROR: Program used external function 'Square' which could not be resolved!

那我该怎么办?

更新

然后我阅读Can't link against static library when compiling objects from LLVM bitcode. 并发现 llvm-ld 在更改订单时有效:

llvm-ld --disable-opt  main.bc libcalc.la -o test

llvm-link 仍然失败。

【问题讨论】:

  • 您可以使用黄金 LTO 插件 - 可以选择保留合并的 IR 文件。
  • @SK-logic 谢谢。但是,那么确切的选择是什么?似乎 llvm 文档(llvm.org/docs/GoldPlugin.html) 包含的内容很少。
  • also-emit-llvm
  • 谢谢,有相关文件吗?我不熟悉 ld 选项。
  • 将其用作“-plugin-opt=also-emit-llvm”

标签: c linker clang llvm


【解决方案1】:
  • llvm-link 不支持位码存档,AFAIK。它只是简单地检查它提供的输入文件,并尝试将每个文件解析为位码文件(二进制或文本 LLVM IR)。
  • llvm-ld 在较新的 LLVM 中不存在,所以我建议完全远离它。

只需将单独的.bc 文件与llvm-link 链接在一起。无论如何,位码文件的归档对链接器的好处与原生链接不同。

【讨论】:

  • 也许需要稍微调整一下 llvm-link 才能像旧的 llvm-ld 一样工作?我们正在处理一个庞大的库,我们想归档位码;否则手动链接对象会很麻烦。
  • @HongxuChen:你可以建议 llvmdev@ 提供一个补丁,让llvm-link 读取档案:-) 此外,请注意,它是一个非常小的工具,实现它的功能很简单(包括增强功能)您自己
【解决方案2】:

您不需要归档器来链接您的位码文件:

clang -emit-llvm -g -c -o main.bc main.c
clang -emit-llvm -g -c -o calc.bc calc.c
clang main.bc calc.bc -o test

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多