Не может выполнить .out файлы, получив отклоненное разрешение

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

Править:

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

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

5 ответов

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

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

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

    chmod 755 a.out
    
  2. Файловая система, над которой вы работаете, не поддерживает разрешения Linux. Это может произойти, если Вы размещаете файлы на флешке в формате FAT32. Решение: либо создайте резервную копию файлов и отформатируйте ее в ext2, либо подключите диск с помощью fmask=0022 или umask=0022 (опустив fmask). Смотрите раздел Mount options for fat на странице руководства по установке .

Для bash-скриптов, в которых нет набора исполняемых битов, можно запустить bash file.sh. Такая возможность существует для всех файлов с исполняемым содержимым (скомпилированные файлы и файлы со строкой shebang #!/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
20
ответ дан 23 November 2019 в 03:54

.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
ответ дан 23 November 2019 в 03:54

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

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

#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
-2
ответ дан 23 November 2019 в 03:54

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

5
ответ дан 23 November 2019 в 03:54

Временное решение для файловых систем FAT в первом ответе

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

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

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

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

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

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

0
ответ дан 23 November 2019 в 03:54

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

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