Clang 如何使用llvm ar生成的归档文件?
Clang 如何使用llvm ar生成的归档文件?,clang,llvm,Clang,Llvm,llvm ar将多个llvm位代码文件归档到一个可链接到程序的归档库中。存档操作按预期工作。同样,可以使用llvm nm来显示生成的存档中的所有符号 但是,我注意到生成的归档文件不能被其他标准llvm工具使用,例如,llc、lli和llvm链接 为了使用生成的存档文件,我必须从存档文件中提取所有位代码文件,然后由llc直接使用它们 问题: 通过llvm ar,是否有更优雅或高效的方法来使用生成的存档文件 可以直接使用位码存档文件,如下所示: 像llc、lli、opt等LLVM工具不能直接对位码存
llvm ar
将多个llvm位代码文件归档到一个可链接到程序的归档库中。存档操作按预期工作。同样,可以使用llvm nm
来显示生成的存档中的所有符号
但是,我注意到生成的归档文件不能被其他标准llvm工具使用,例如,llc
、lli
和llvm链接
为了使用生成的存档文件,我必须从存档文件中提取所有位代码文件,然后由llc
直接使用它们
问题:
llvm ar
,是否有更优雅或高效的方法来使用生成的存档文件像
llc
、lli
、opt
等LLVM工具不能直接对位码存档进行操作。您必须在运行它们之前将其解压缩。或者,您可以将归档项链接到单个位代码文件中,但这与归档不同,因此这取决于是否适合您
至于
clang
,您可以将位码存档与源文件和库一起传递,它会做正确的事情-解包,运行passs,编译到目标文件并链接到最终二进制文件。因此,您的问题仅针对存档BC文件,还是它是OBJ和BC的组合?我的问题针对存档BC文件,我也更新了问题。谢谢你指出了歧义。你所说的使用方法是什么意思clang
可以立即处理位码存档。@arrowd,我的意思是如果位码存档可以直接由clang/llc/lli/llvm链接使用,而无需取消存档。你能举一个例子说明一下clang是如何使用位码档案的吗?请您也指定一下clang的版本好吗。我担心我的叮当版本是3.8,它可能太低了。谢谢。谢谢你的回复。我花了一个小时研究如何使用clang构建位码存档文件,但还是失败了。。。我在问题中添加了代码,您能指出如何修复它吗?libhello
文件应该有.bca
扩展名.ll
用于文本IR文件,因此clang尝试将其解析为文本。感谢您的提示,我将.ll扩展名更改为.bca,但它仍然不适用于我。我在问题中添加了新的错误消息。PS:我也试过使用clang-5.0,它也可以。再次感谢。叮当5可能还是太老了。我用Clang9可以使用它。我试过Clang9.0.0,但仍然不起作用。我可以知道你的确切版本是什么吗?谢谢
// assumes hello.bc is valid bitcode file and it is built successfully
clang-3.8 -o main main.c hello.bc
// ar hello.bc into lib libhello.bca
llvm-ar-3.8 rcs libhello.bca hello.bc
llvm-nm libhello.bca // has below output
hello.bc:
---------------- T outupt
U puts
clang-3.8 -o main main.c libhello.bca // has below error
libhello.bca: error adding symbols: File format not recognized
clang: error: linker command failed with exit code 1 (use -v to see invocation)