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

10

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

Edit

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

bash: ./a.out: Permission denied
    
задан Shamim Hafiz 23.05.2011 в 12:24
источник

5 ответов

15

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

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

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

    chmod 755 a.out

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

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

/lib/ld-linux-x86-64.so.2 a.out
    
ответ дан Lekensteyn 23.05.2011 в 18:06
источник
5

.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» на ваш идентификатор пользователя.

    
ответ дан fossfreedom 23.05.2011 в 12:29
4

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

    
ответ дан user65868 24.05.2012 в 15:36
0

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

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

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

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

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

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

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

    
ответ дан wolfy 29.05.2013 в 01:24
-1

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

Мне было бы интересно узнать, какую командную строку вы использовали для создания этого файла, поскольку компилятор GNU GCC c ++, 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

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

$ g++ hello.cc
$ ./a.out
Hello World
    
ответ дан SpamapS 23.05.2011 в 12:52