assembly - addr2line 的反转

标签 assembly dwarf addr2line

给定目标文件和地址,addr2line 工具可以将其与源代码中的文件和行号关联起来。

我想要相反的。给定行号和目标文件,我想获取与源代码​​中给定行相对应的指令地址列表。

我知道我可以使用 objdump -DS 并查找一行,但这很不方便,并且需要手动过滤掉地址。如果我给它一个行列表,你知道有什么工具可以完成我想要的事情吗?

更新。

我举了一个我想要的例子。

我有一组文件行:

src/a.c:14
src/a.c:28
src/b.c:44

我将此列表传递给一个工具:

cat lines | line2addr -e lib.so

它向我报告这些行的指令地址:

0x442: src/a.c:14
0x444: src/a.c:14
0x44a: src/a.c:14
0x584: src/a.c:28
0x588: src/a.c:28
...

最佳答案

以实用方式执行此操作的方法是使用以下 GDB 命令行:

gdb ../main.o -ex "info line main.c:39" --batch 
Line 39 of "main.c" starts at address 0x36 <main+54> and ends at 0x5e <main+94>.

GDB 接受使用调试信息编译的对象或可执行文件(-g)。使用 GDB 7.6 及更高版本。早期版本在 Windows 上加载对象文件时崩溃。

可以通过多次应用 -ex 开关来翻译多行:

gdb ../main.o -ex "info line main.c:39" -ex "info line main.c:41" --batch
Line 39 of "main.c" starts at address 0x36 <main+54> and ends at 0x5e <main+94>.
Line 41 of "main.c" starts at address 0x5e <main+94> and ends at 0x70 <main+112>.

关于assembly - addr2line 的反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33954368/

相关文章:

c - 如何修改文件 'jonesforth.S' 以便它可以返回到 C 调用函数而不导致段错误?

c - 如何将 C void* 指针转换为指向结构的指针(将结构定义为字符串)?

C++ - Windows 上有类似 addr2line 的命令吗

c - 带有存档文件的 addr2line

c++ - 分析由于库故障而发生的崩溃的回溯

c - 机器指令中 exit(0) 时为 "Access violation reading"?

assembly - 扩展编译器以获得自己的汇编输出

assembly - 了解 `lw` 和 `sw` 在 MIPS 程序中的实际工作方式

macos - OSX 上的 LLDB 没有调试信息/源代码

compiler-construction - LLVM 和 dwarf 调试信息