【问题标题】:Disassembly of Android NDK code [duplicate]Android NDK代码反汇编[重复]
【发布时间】:2012-05-17 11:40:15
【问题描述】:

可能重复:
How do you get assembler output from C/C++ source in gcc?

我有一个简单的问题。

我有一些为 Android 应用程序编写的原生 C++ 代码。

当我在 Eclipse 中编译我的项目时,我有什么办法可以看到我的 GCC 编译器生成了哪些汇编代码?

【问题讨论】:

  • 嗨,Brian,这是一个不同的问题,因为它是在 Android 的 NDK 的上下文中。我通过 cygwin 和 eclipse 设置使用 GCC 编译器。所以不清楚我应该如何将额外的参数传递给 cygwin 中的 GCC 编译器,该编译器在我的项目中使用 makefile 来编译 .c 和 c++ 文件。如果你有任何线索,请告诉我

标签: android eclipse gcc android-ndk arm


【解决方案1】:

您可以通过多种方式做到这一点。

  1. 在您的Android.mk 中将-S 标志添加到LOCAL_CFLAGS。然后run ndk-build。但这将在第一个文件上失败,因此您不会在以后的文件中获得汇编代码。
  2. 从所需文件的命令行手动调用arm-linux-androideabi-gcc -S file.cpp。此外,您可能需要传递正确的包含定义。运行 ndk-build V=1 以查看它使用的确切命令行
  3. 正常运行构建以获取共享库(.so 文件)。并运行arm-linux-androideabi-objdump -d libYourLibrary.so >disasm.txt。这将分解整个库,而不仅仅是一个 .cpp 文件。

【讨论】:

  • 谢谢马丁斯。 #1对我不起作用,因为您说它使链接过程失败。对于#2,我尝试了 gcc -s 选项,但不知道如何给出正确的包含定义? NDK-build 上的 -V 选项未被识别为有效。对于#3,我发现了如何在我的对象 .o 文件上使用 objdump。这工作正常,我使用了一个额外的“-l”选项来查看相应 .cpp 文件的行号。现在,转储文件包含每个 .cpp 行的汇编代码,但有些行重复多次。这是因为在这些行上调用其他函数吗?请回答。
  • 一些输出示例:D:\Development\Workspace\Quake3\Quake3/jni/engine/frustum.cpp:253 20: 2302 movs r3, #2 D:\Development\Workspace\Quake3\Quake3 /jni/engine/frustum.cpp:251 22: 9106 str r1, [sp, #24] 24: 6892 ldr r2, [r2, #8] 26: 9205 str r2, [sp, #20] 28: 6a40 ldr r0, [r0, #36] ; 0x24 D:\Development\Workspace\Quake3\Quake3/jni/engine/frustum.cpp:256 2a: 2200 movs r2, #0 2c: 9201 str r2, [sp, #4] D:\Development\Workspace\Quake3\ Quake3/jni/engine/frustum.cpp:253 2e: 930b str r3, [sp, #44] ; 0x2c 30: 1c06 添加 r6, r0, #0
  • 请帮帮我我可爱的人
  • 链接过程当然会失败。因为 -S 指示 gcc 生成汇编文件,而不是目标文件。您只需在任何文本编辑器中打开目标文件,就可以为您的 C/C++ 代码进行汇编。关于无效的-V,这是我的错误,我对正确论点的回答。
  • Martins,你能看看我在文本编辑器中粘贴的代码吗?我只想指出 c++ 文件的某些行号是如何用不同的汇编代码重复的...
猜你喜欢
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 2015-12-21
  • 2012-04-30
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多