如何在 llvm 编译时将 DWARF 信息转储到文件中?
How to dump DWARF information into a file while llvm compiles?
我想知道如何在 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;
}
段故障信息:
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
是的,您可以使用 MCJIT 在运行时编译新代码并为其生成 DWARF。
llc
有 -split-dwarf
标志。 Clang 也是如此 (-gsplit-dwarf
).
(添加为答案,因为评论变得太长了)
FWIW 我们现在只支持 linux 上的 split dwarf,因为需要一个支持使用的 objcopy,OS X 做它自己的事情,我们没有任何解决方案 windows现在。
也就是说,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 文件。
如果您想要整个程序的 dwarf 文件,您需要使用 dwp 实用程序将所有各种 .dwo 文件合并到一个包文件中。您需要使用 clang 驱动程序来完成第一部分,因为它知道如何在每个单独的文件上调用 objcopy,llc 没有内置的知识(尽管它会产生正确的 dwarf 输出,但它不会分裂出来)。
对于Mac OSX,您可以通过系统自带的dsymutil 程序执行此操作。 clang -g foo.c -o foo 将生成一个 .dSYM 目录,其中包含整个程序的 dwarf。
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
我想知道如何在 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;
}
段故障信息:
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
是的,您可以使用 MCJIT 在运行时编译新代码并为其生成 DWARF。
llc
有 -split-dwarf
标志。 Clang 也是如此 (-gsplit-dwarf
).
(添加为答案,因为评论变得太长了)
FWIW 我们现在只支持 linux 上的 split dwarf,因为需要一个支持使用的 objcopy,OS X 做它自己的事情,我们没有任何解决方案 windows现在。
也就是说,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 文件。
如果您想要整个程序的 dwarf 文件,您需要使用 dwp 实用程序将所有各种 .dwo 文件合并到一个包文件中。您需要使用 clang 驱动程序来完成第一部分,因为它知道如何在每个单独的文件上调用 objcopy,llc 没有内置的知识(尽管它会产生正确的 dwarf 输出,但它不会分裂出来)。
对于Mac OSX,您可以通过系统自带的dsymutil 程序执行此操作。 clang -g foo.c -o foo 将生成一个 .dSYM 目录,其中包含整个程序的 dwarf。
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