【问题标题】:Reverse of addr2lineaddr2line 的反转
【发布时间】:2016-03-01 11:28:05
【问题描述】:

给定一个目标文件和地址 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 调试器可以对可执行文件(而不是单个目标文件)执行此操作。当然,您需要使用调试信息进行编译..
  • gcc.godbolt.org 在将线映射到 asm 的小功能方面做得很好。它甚至有颜色编码。例如goo.gl/aLPTts
  • @BasileStarynkevitch 我可以使用调试信息进行编译。但我不完全明白如何获取 gdb 中的地址。我发现我可以设置一个断点,但它只显示一个地址,虽然同一行可以有多个指令。

标签: assembly dwarf addr2line


【解决方案1】:

以实用方式执行此操作的方法是使用以下 GDB cmd-line:

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>.

【讨论】:

    【解决方案2】:

    仔细阅读documentation of GDB。如果您的可执行文件是使用调试信息构建的(使用-g 编译的所有代码),您可以使用 stack related 命令、machine code related 命令等

    我不确定你的愿望,但我猜disx 命令可能会有所帮助

    此外,最近的 GDB 可以在 Python 和 Guile 中编写脚本。

    【讨论】:

    • 用一个例子更新了问题
    猜你喜欢
    • 1970-01-01
    • 2020-02-10
    • 2012-07-19
    • 2019-09-26
    • 2013-01-01
    • 2018-08-11
    • 2012-07-07
    • 2011-08-23
    • 2011-07-15
    相关资源
    最近更新 更多