如何使用otool检查是否启用了堆栈粉碎?

时间:2018-08-15 03:29:40

标签: xcode otool

我看到很多答案,例如互联网上的thisthis,说使用otool命令检查项目中的stack_chk_guardstack_chk_fail

问题是,我不知道otool必须应用于哪个文件。在source上,他们说此otool将应用于扩展名为.a的文件,该文件是一个库。但是我不知道如何将其应用于我想检查整个项目而不只是一个库的情况。我试图在我的项目中找到扩展名为.a的任何文件,但没有找到任何文件。我尝试对otool.app.framework.xcarchive运行.ipa,但都失败了。

有人可以帮忙吗?如有必要,请进行详细说明,因为我以前从未使用过otool,并且互联网上的文档对描述otool可以检查哪些文件完全没有帮助。

1 个答案:

答案 0 :(得分:4)

经过一次艰难的搜索后,我发现应该向otool提供的文件位于.app目录中。是的,.app是目录,而不是文件。

这就是方法:

  • 首先构建您的项目,这将创建一个.app文件。
  • 在Xcode项目导航器(左侧)中,在底部过滤.app名称。
  • 右键单击.app文件,选择“在finder中显示”。
  • 打开一个终端窗口。
  • 键入cd,然后将.app目录拖到终端上。它将填充路径。
  • 键入otool -Iv Your_App_Binary_Name | grep stack

Your_App_Binary_Name位会让您感到困惑,但不要这样。只要注意您的.app目录的名称即可。例如,如果目录为MyApp.app,则您的二进制文件应为MyApp,位于MyApp.app目录内,且没有扩展名。如果您使用finder查看文件(右键单击.app并选择“显示软件包内容”),您将看到二进制文件的类型是UNIX可执行文件。

(请记住,如果您的应用程序名称包含空格,则需要使用反斜杠来转义该空格。例如,如果您的应用程序名称为“ My Holy App”,则目录为My\ Holy\ App.app,该应用的二进制文件是My\ Holy\ App

因此,对于名为“我的应用”的目标,您的终端应如下所示:

$ cd ......./Build/Products/Debug-iphoneos/MyApp.app
$ otool -Iv MyApp | grep stack
0x00000001000c17bc 19966 ___stack_chk_fail
0x00000001000d8268 19967 ___stack_chk_guard
0x00000001000d8d18 19966 ___stack_chk_fail

或者如果您的目标有“我的神圣应用”之类的空格:

$ cd ......./Build/Products/Debug-iphoneos/My\ Holy\ App.app
$ otool -Iv My\ Holy\ App | grep stack
0x00000001000c17bc 19966 ___stack_chk_fail
0x00000001000d8268 19967 ___stack_chk_guard
0x00000001000d8d18 19966 ___stack_chk_fail

编辑:用户mnemonic23指出,如果使用从位码重建的方式编译IPA,则otool的结果将不会显示以上结果。您必须编译IPA,而无需从位代码重建。