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

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

Edit:

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

bash: ./a.out: Permission denied
10
задан 18 June 2012 в 23:06

39 ответов

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

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

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

Another однако параметр эффективно отключает выполнение двоичных файлов, особенно если FAT-файловая система установлена ​​как не-root-user: noexec

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

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

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

0
ответ дан 7 August 2018 в 21:24

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

Мне было бы интересно узнать, что командной строки, которую вы использовали для создания этого файла, поскольку компилятор C ++ 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», to 'int main' работает:

$ g++ hello.cc
$ ./a.out
Hello World
-1
ответ дан 7 August 2018 в 21:24

.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

т.е. замените «fred» на ваш идентификатор пользователя.

5
ответ дан 7 August 2018 в 21:24

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

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

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

Another однако параметр эффективно отключает выполнение двоичных файлов, особенно если FAT-файловая система установлена ​​как не-root-user: noexec

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

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

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

0
ответ дан 10 August 2018 в 09:42

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

Мне было бы интересно узнать, что командной строки, которую вы использовали для создания этого файла, поскольку компилятор C ++ 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», to 'int main' работает:

$ g++ hello.cc
$ ./a.out
Hello World
-1
ответ дан 10 August 2018 в 09:42

.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

т.е. замените «fred» на ваш идентификатор пользователя.

5
ответ дан 10 August 2018 в 09:42

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

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

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

Another однако параметр эффективно отключает выполнение двоичных файлов, особенно если FAT-файловая система установлена ​​как не-root-user: noexec

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

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

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

0
ответ дан 13 August 2018 в 15:54

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

Мне было бы интересно узнать, что командной строки, которую вы использовали для создания этого файла, поскольку компилятор C ++ 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», to 'int main' работает:

$ g++ hello.cc
$ ./a.out
Hello World
-1
ответ дан 13 August 2018 в 15:54
  • 1
    Если у него не было функции main , она не будет связываться, и поэтому она не создаст файл a.out . – JRT 23 May 2011 в 18:11

.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

т.е. замените «fred» на ваш идентификатор пользователя.

5
ответ дан 13 August 2018 в 15:54
  • 1
    Спасибо за информацию. Я фактически зарегистрирован как единственный пользователь, и я полагаю, что я главный пользователь. Я не совсем уверен, почему мне все равно нужно использовать административную аутентификацию. Как я смогу удалить эту опцию, чтобы я всегда мог запускать файлы. – Shamim Hafiz 23 May 2011 в 17:33
  • 2
    обновлено - надеюсь, уточнить и ответить на ваш вопрос. – fossfreedom♦ 23 May 2011 в 17:40
  • 3
    a.out является устаревшей функцией компилятора, поэтому он генерирует предсказуемое имя файла, если вы его не запрашивали. Это не проблема с разрешениями, но непонимание того, как работают компиляторы и C ++. – SpamapS 23 May 2011 в 17:43
  • 4
    Linux / Unix не полагается на расширения файлов, чтобы определить тип файла. Обычно исполняемые файлы вообще не имеют расширения. Кроме того, формат для исполняемого файла вообще не отличается между оболочками. Все оболочки должны работать с ./ a.out , если это не какая-то экзотическая оболочка. – JRT 23 May 2011 в 17:54
  • 5
    Наводчик - скопируйте и вставьте полный вывод в терминал, начиная с вашей команды компиляции, за которой следуют ls -l, chmod + x и, наконец, выполнение. Пожалуйста, подтвердите свое имя, набрав & quot; whoami & quot; – fossfreedom♦ 23 May 2011 в 23:32

Другие вопросы по тегам:

Похожие вопросы: