【问题标题】:"Operation not permitted" running hello world binary compiled w/ clang++ on El Capitan“不允许操作”在 El Capitan 上运行使用/ clang 编译的 hello world 二进制文件
【发布时间】:2016-01-01 21:08:33
【问题描述】:

背景

我创建了一个简单的 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. 从恢复操作系统终端使用csrutil disable 禁用“系统完整性保护”,重新启动、重新编译和运行a.out。结果相同的错误消息。

问题

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

【问题讨论】:

  • “不允许操作”可能与不可用的共享库之类的东西有关。 [而 g++ 指向 clang++,而不是 llvm,尽管确实,clang 确实使用 llvm 来生成机器代码——我知道,细节,但仍然是正确的细节]
  • sudo chmod u+x a.out?
  • @VioletGiraffe:呃,ls -l 的结果表明该文件对所有人都是可执行的……
  • 您是否尝试过在终端中首先运行xcode-select --install?虽然可能不是问题...
  • 您不在使用noexec 挂载的文件系统上吗?

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


【解决方案1】:

想通了。

我的代码在一个加密的稀疏图像上,上面设置了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)

实际的 sparseimage 位于我的主文件夹中,标题为 work.sparseimage。我像这样删除了隔离属性:

$ xattr -d com.apple.quarantine work_personal.sparseimage

然后我卸载(弹出)图像,然后重新安装它,重新编译文件并执行它没有错误。

特别感谢 @Mark Setchell 在问题的 cmets 中询问我是否在驱动器上设置了 noexec,并感谢其他所有人的建议。

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 2017-05-23
    • 2016-10-10
    • 2020-08-02
    • 2016-12-30
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多