Фон

Я создал простую программу Hello World на C ++:

#include 
using namespace std;

int main() {
    cout << "Hello World!" << endl;
    return 0;
}

И скомпилировал его с помощью clang ++ вот так (очевидно, g ++ указывает на clang ++ в OS X):

g++ helloworld-cpp.cpp

Это создает исполняемый файл, a.out. Запуск его в командной строке приводит к тому, что bash выдает ошибку Операция запрещена, как показано:

$ ./a.out
-bash: ./a.out: Operation not permitted

Что я пробовал

  1. Проверка наличия у файла разрешений на выполнение и отсутствия атрибутов или флагов, которые препятствовали бы его запуску, с помощью ls -leO:

    -rwxr-xr-x 1 посох монарха - 15212 1 января 13:51 a.out

  2. Отключение «Защиты целостности системы» с помощью csrutil disable из терминала ОС восстановления, перезагрузка, перекомпиляция и запуск a.out. Те же сообщения об ошибках.

Вопрос

Существуют ли какие-либо другие ограничения, которые могут помешать запуску двоичных файлов, которые я компилирую в Mac OS X?

Monarch

Ответов: 1

Ответы (1)

Разобрался.

Мой код находился на зашифрованном разреженном изображении, для которого был установлен атрибут в карантине. Я проверил это, запустив 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. Я удалил атрибут карантина так:

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

Затем я размонтировал (извлек) образ, затем снова смонтировал его, перекомпилировал файл, и он выполнил без ошибок.

Особая благодарность @Mark Setchell за то, что он спросил меня в комментариях к вопросу, установлено ли noexec на диске, и всем остальным за их предложения.

2022 WebDevInsider