背景
我创建了一个简单的Hello World C ++程序:
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
用clang ++编译它就像这样(显然,g ++指向OS X上的clang ++):
g++ helloworld-cpp.cpp
这会生成一个可执行文件a.out
。在提示符下运行它会导致bash抛出错误Operation not permitted
,如下所示:
$ ./a.out
-bash: ./a.out: Operation not permitted
我尝试过的事情
使用ls -leO
验证文件是否具有执行权限,并且没有阻止其运行的属性或标志:
-rwxr-xr-x 1 monarch staff - 15212 Jan 1 13:51 a.out
从Recovery OS终端使用csrutil disable
禁用“系统完整性保护”,重新启动,重新编译和运行a.out
。产生相同的错误消息。
问题
是否还有其他限制可以阻止我在Mac OS X上编译的二进制文件运行?
答案 0 :(得分:1)
想出来。
我的代码是在加密的sparseimage上,其上设置了quarantined
属性。我通过像mount
这样运行/Volumes/work
来检查这一点(参见$ mount
/dev/disk0s2 on / (hfs, local, journaled)
/dev/disk2s2 on /Volumes/work (hfs, local, nodev, nosuid, journaled, noowners, quarantine, mounted by monarch)
上的属性):
work.sparseimage
实际的sparseimage位于我的主文件夹中,标题为$ xattr -d com.apple.quarantine work_personal.sparseimage
。我删除了隔离属性,如下所示:
noexec
然后我卸载(弹出)图像,然后重新安装它,重新编译文件并执行它而没有错误。
特别感谢@Mark Setchell在问题的评论中询问我是否在驱动器上设置了NSString *countryCode = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
if ([countryCode isEqualToString:@"UK"]) {
NSString *startString = @"£ ";
}
if ([countryCode isEqualToString:@"US"]) {
NSString *startString = @"$ ";
}
,并向其他人提出建议。