Не удается выполнить файлы.out, получение разрешения запрещено

Я написал программу на C++ и выполнил ее для создания файла.out. Однако всякий раз, когда я пытаюсь запустить его, я получаю разрешение на отказ. Я читал, что мы можем использовать sudo, но не могу заставить его работать. Я использую что-то вроде sudo "./a.out", но это тоже не работает.

Редактировать:

Вот сообщение, которое я получаю, когда пытаюсь "./a.out".

bash: ./a.out: Permission denied

6 ответов

Решение

Обычно, g++ дает созданный файл разрешения на выполнение. Если вы не пройдете -o опция, файл будет назван a.out,

Две возможные причины, по которым в вашем файле не установлен бит выполнения, со своими решениями:

  1. Значение umask устанавливается равным 0133, тем самым предотвращая установку бита выполнения. Решение: установите разрешения явно:

    chmod 755 a.out

  2. Файловая система, над которой вы работаете, не поддерживает разрешения Linux. Это может иметь место, если вы помещаете файлы на флэш-диск в формате FAT32. Решение: создайте резервную копию файлов и отформатируйте их в ext2 или подключите диск с помощью fmask=0022 или же umask=0022 (опуская fmask). См. Раздел " Параметры монтирования для толстого " на странице руководства по монтированию для получения дополнительной информации.

Для сценариев bash, для которых не установлен бит выполнения, вы можете запустить bash file.sh, Такая функция существует для всех файлов с исполняемым содержимым (скомпилированные файлы и файлы со строкой Шебанга #!/path/to/interpreter задавать). Чтобы выполнить файлы без установленного бита выполнения, используйте специальный файл /lib/ld-linux.so.2 (или же /lib/ld-linux-x86-64.so.2 для 64-битных приложений) запустить такую ​​программу:

/lib/ld-linux-x86-64.so.2 a.out

Просто скопируйте папку в вашу домашнюю папку, и она будет работать. Вы, вероятно, пытаетесь запустить его на внешнем диске или что-то.

.out - необычное расширение. Обычно это обычно означает файл "трассировки".

Проверьте синтаксис, который вы используете для компиляции

например

gcc myfile.c /usr/lib/libsomelibrary.a -o outputfilename

или, может быть

g++ myfile.cpp -lm -o outputfilename

Вы можете проверить, установлен ли исполняемый бит в файле

ls -l a.out

или вы можете просто заставить исполняемый бит

chmod +x a.out

тогда вы можете запустить свой файл

./a.out

или просто

a.out

Возможно, вам также следует проверить, что выходной файл записан правильно в виде двоичного файла.

т.е.

file a.out

Это сообщит, в каком формате находится файл - либо скрипт, либо двоичный файл.

Вам редко нужно запускать с правами root, если вы не ограничены, кто должен иметь возможность запускать исполняемый файл.

Если вы скомпилировали от имени пользователя root (например, sudo make), или у вас есть Makefile, который установил исполняемый файл от имени пользователя root, то я могу предложить вам вернуть разрешение, когда пользователь вошел

т.е.

sudo chown fred:fred a.out

т.е. замените "Фред" на ваш идентификатор пользователя.

Обходной путь для FAT-файловых систем в первом ответе

"Это может иметь место, если вы помещаете файлы на флеш-диск в формате FAT32. Решение: (...) смонтируйте диск с помощью fmask=0022 или umask=0022 (без fmask)".

обычно не работает - по умолчанию umask в большинстве случаев равен 0022, так что это ничего не меняет.

Однако по умолчанию другой параметр монтирования фактически запрещает выполнение двоичных файлов, особенно если файловая система FAT смонтирована как пользователь без полномочий root: noexec

Так что просто монтируйте диски в формате FAT с опцией exec вот так:

sudo mount -o exec /dev/sd.. /mountpoint

(обычно это нужно делать с правами root, отсюда и "sudo"), и вы сможете запускать двоичные файлы прямо оттуда.

на Zorin/Ubuntu я понимаю это..

      $ g++ --std=c++17 -Werror -Wall main.cpp -o main.out
$ sudo chmod +x main.out
$ ./main.out

bash: ./main.out: разрешение отклонено

Мне пришлось перенести весь свой REPO с USB-накопителя на SSD.

На USB мне не удалось сделать его исполняемым. Теперь работает без chmod.

Держу пари, что в вашей программе нет функции main(), как если бы она была, ваш компилятор сделал бы исполняемый файл.out. Прямо сейчас это просто объектный файл, полный кода, но нет точки входа. main() - это имя специальной функции в C и C++, которое указывает компилятору создавать программу, а не просто объектные файлы, которые могут быть связаны с программой или библиотекой.

Мне было бы интересно узнать, какую командную строку вы использовали для создания этого файла, поскольку g ++ компилятор GNU GCC g ++ не позволит мне создать простую программу без основной функции:

#include <iostream>

using namespace std;

void no_main()
{
  cout << "Hello World" << endl;
}

$ g++ hello.cc
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 21
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

Однако, если я сделаю изменение 'void no_main' на 'int main', это сработает:

$ g++ hello.cc
$ ./a.out
Hello World
Другие вопросы по тегам