【问题标题】:arm assembly code - understanding disassemble of cpp sourcearm汇编代码——理解cpp源码的反汇编
【发布时间】:2013-08-01 11:39:54
【问题描述】:

我已经在 arm 中反汇编了代码。我想知道这些指令在其原始源文件中对应的行号。

另外,我想了解一些事情。

一个函数,例如 android::CameraHardware::createInstance 在程序集中显示为 _ZN7android18CameraHardware14createInstanceEib 。我什至不完全确定这是否是我应该与之比较的正确功能。

为什么名字这么奇怪,前后都加东西?我通常对 C 代码做同样的事情。反汇编代码中的函数名称看起来很直观。

所以总结一下,我有两个问题。

  • 在 GDB 内部,有没有办法我可以得到一个行号 汇编指令的特定行?

    例如在 0x40d9078c,我想知道它是哪一行 对应于它的源文件。我试过信息线。没用。任何 其他建议?

  • 当我们在理解cpp代码的反汇编时,如何 了解命名约定?还有我们需要做的其他事情 理解为先决条件?

谢谢。

【问题讨论】:

  • 提示:如果你错过了直接的名字,请查看extern "C"
  • 1) 学习 C++ 名称修饰。 2) 学习一种调试符号语言(如 DWARF)。
  • 不知道gdb,但您可以使用objdump-SCld 选项来获得与原始源代码和行号混合的反汇编,并带有去错的名称。
  • @Michael 非常感谢。现在对我来说有点清楚了。但是我看不到源。但我可以看到名字被破坏了
  • 除非您使用调试信息进行编译,否则您将看不到源代码。请参阅 Mats Petersson 的回答。

标签: c++ arm


【解决方案1】:

android::CameraHardware::createInstance_ZN7android18CameraHardware14createInstanceEib 的转换称为“名称修改”,对于C++ 来说是正常的。这是您如何拥有多个具有相同名称的函数,采用不同的参数,并让链接器在您仅声明它但没有定义它时告诉您“我找不到foo(int x, double y)”。

在 Linux 中,您可以使用 c++filt 将已损坏的名称转换为其未损坏的形式(假设它是使用 Linux 样式的修饰约定编译的 - android 会这样做 - 但如果您要使用 Microsoft 编译的一段代码,它显然不会工作)。

如果您使用调试符号进行编译,gdb 应该能够向您显示给定代码的源代码。将-g 添加到编译中的g++ 行。

【讨论】:

  • 感谢您提供的信息垫。你能在我的问题下面回答我的评论吗?会有帮助的
  • 是的,我相信您可以在android.mk 或其依赖项之一中找到某个位置。不幸的是,我不确切知道在哪里/如何做到这一点。可能最容易搜索函数的名称(grep -r CameraHardware::createInstance * 在某个包含 Android 系统源代码的地方),然后查看“附近”某处是否有覆盖该源文件的 makefile。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2011-06-16
  • 2015-12-21
相关资源
最近更新 更多