“操作不允许”在El Capitan上运行hello world binary w / clang ++

时间:2016-01-01 21:08:34

标签: c++ osx-elcapitan clang++

背景

我创建了一个简单的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

我尝试过的事情

  1. 使用ls -leO验证文件是否具有执行权限,并且没有阻止其运行的属性或标志:

    -rwxr-xr-x 1 monarch staff - 15212 Jan 1 13:51 a.out

  2. 从Recovery OS终端使用csrutil disable禁用“系统完整性保护”,重新启动,重新编译和运行a.out。产生相同的错误消息。

  3. 问题

    是否还有其他限制可以阻止我在Mac OS X上编译的二进制文件运行?

1 个答案:

答案 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 = @"$ "; } ,并向其他人提出建议。