我想知道如何在llvm编译IR时插入一些代码,以便生成DWARF信息文件。
(我不是要求在生成二进制文件后使用objdump / llvm-dwarfdump工具)
提前谢谢。我尝试了Eli的回答,我在这里遇到了段错误,可能是我误用了它?
clang-3.7 -g -emit-llvm -c main.c -o build/main.bc
clang-3.7 -g -emit-llvm -c sum.c -o build/sum.bc
llvm-link-3.7 build/main.bc build/sum.bc -o build/main.linked.bc
llc-3.7 -split-dwarf Enable build/main.linked.bc -o build/main
main.c中:
#include <stdio.h>
int sum(int x, int y);
int main()
{
int r = sum(3, 4);
printf("r = %d\n", r);
return 0;
}
sum.c:
int sum(int x, int y) {
return x + y;
}
Seg故障信息:
0 libLLVM-3.7.so.1 0x00002b332cdf0af8 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 56
1 libLLVM-3.7.so.1 0x00002b332cdeff59
2 libc.so.6 0x00002b332e0bdd40
3 libLLVM-3.7.so.1 0x00002b332c86d146 llvm::MCExpr::print(llvm::raw_ostream&, llvm::MCAsmInfo const*) const + 134
4 libLLVM-3.7.so.1 0x00002b332c86d243 llvm::MCExpr::print(llvm::raw_ostream&, llvm::MCAsmInfo const*) const + 387
5 libLLVM-3.7.so.1 0x00002b332c84e356
6 libLLVM-3.7.so.1 0x00002b332c2f4927 llvm::AsmPrinter::EmitLabelPlusOffset(llvm::MCSymbol const*, unsigned long, unsigned int, bool) const + 87
7 libLLVM-3.7.so.1 0x00002b332c2fe6df llvm::AsmPrinter::emitDwarfDIE(llvm::DIE const&) const + 111
8 libLLVM-3.7.so.1 0x00002b332c2fe713 llvm::AsmPrinter::emitDwarfDIE(llvm::DIE const&) const + 163
9 libLLVM-3.7.so.1 0x00002b332c325a29 llvm::DwarfFile::emitUnits(bool) + 105
10 libLLVM-3.7.so.1 0x00002b332c323bf0 llvm::DwarfDebug::endModule() + 992
11 libLLVM-3.7.so.1 0x00002b332c2fc251 llvm::AsmPrinter::doFinalization(llvm::Module&) + 513
12 libLLVM-3.7.so.1 0x00002b332c6424b5 llvm::FPPassManager::doFinalization(llvm::Module&) + 69
13 libLLVM-3.7.so.1 0x00002b332c64c09d llvm::legacy::PassManagerImpl::run(llvm::Module&) + 797
14 llc-3.7 0x0000000000413d1f
15 llc-3.7 0x000000000040ea50 main + 384
16 libc.so.6 0x00002b332e0a8ec5 __libc_start_main + 245
17 llc-3.7 0x000000000040eaa9
Stack dump:
0. Program arguments: llc-3.7 -split-dwarf Enable build/main.linked.bc -o build/main
答案 0 :(得分:4)
(因为评论变得太长而添加作为答案)
FWIW我们现在只支持linux上的split dwarf,因为需要一个支持使用的objcopy,OS X自己做的事情,而且我们现在还没有任何Windows解决方案。 / p>
那说,对于linux:
clang -gsplit-dwarf -g foo.c -o foo.o
clang -gsplit-dwarf -g bar.c -o bar.o
将分别为foo.o(foo.dwo)和bar.o(bar.dwo)生成.dwo文件。
如果您需要整个程序的矮文件,则需要使用dwp实用程序将所有各种.dwo文件合并到一个包文件中。您需要使用clang驱动程序来执行第一部分,因为它知道如何在每个单独的文件上调用objcopy,llc没有内置的知识(尽管它会产生正确的矮化输出,它只是不会把它拆分出去。)
对于Mac OSX,您可以通过系统上的dsymutil程序执行此操作。 clang -g foo.c -o foo将生成一个.dSYM目录,其中包含整个程序的矮人。
issola:~/tmp> ls -l a.x.dSYM/Contents/Resources/DWARF/a.x
-rw-r--r-- 1 echristo 5001 9071 Jul 19 20:28 a.x.dSYM/Contents/Resources/DWARF/a.x
答案 1 :(得分:0)
是的,您可以使用MCJIT在运行时编译新代码并为其生成DWARF。
llc
有-split-dwarf
标志。 Clang(-gsplit-dwarf
)也是如此。