创建和使用LLVM bitcode库

时间:2013-07-03 23:36:57

标签: clang llvm

我有一个C ++项目,它使用了我也写过的C ++库。我正在使用clang ++ 3.3来构建一切。库中的每个文件都编译为

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

然后我使用llvm-link将所有库* .bc文件组合成一个像这样的位代码文件

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

然而,似乎正在发生的事情是,当我链接应用程序的位代码时,MyLibrary.bc的全部内容似乎都包含在结果中。因此,最终链接需要解析我实际上没有使用的库组件所做的引用。

我想要做的是从MyLibrary.bc中提取我的应用程序所需的位代码文件。我看到有一个llvm-ar程序,但在阅读它时,我不会觉得它会有所帮助。我猜我可以将库与llvm-ar结合使用而不是llvm-link,但我无法弄明白。我希望我所需要的只是一点推力:)

1 个答案:

答案 0 :(得分:4)

编辑:实际上它是ar使它起作用。

迟到但仍可能与某人有关,我们使用arld.gold与LLVM插件链接bitcode:

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只需要符号。