我看到很多答案,例如互联网上的this和this,说使用otool
命令检查项目中的stack_chk_guard
和stack_chk_fail
问题是,我不知道otool必须应用于哪个文件。在source上,他们说此otool
将应用于扩展名为.a
的文件,该文件是一个库。但是我不知道如何将其应用于我想检查整个项目而不只是一个库的情况。我试图在我的项目中找到扩展名为.a
的任何文件,但没有找到任何文件。我尝试对otool
,.app
,.framework
和.xcarchive
运行.ipa
,但都失败了。
有人可以帮忙吗?如有必要,请进行详细说明,因为我以前从未使用过otool
,并且互联网上的文档对描述otool
可以检查哪些文件完全没有帮助。
答案 0 :(得分:4)
经过一次艰难的搜索后,我发现应该向otool提供的文件位于.app
目录中。是的,.app
是目录,而不是文件。
这就是方法:
.app
文件。.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,而无需从位代码重建。