Я написал программу на C ++ и выполнил ее для создания файла a.out. Однако, когда я пытаюсь запустить его, я получаю отказ от прав. Я читал, что мы можем использовать sudo, но я не могу заставить его работать. Я использую что-то вроде sudo "./a.out", но это тоже не работает.
Edit:
Вот сообщение, которое я получаю, когда пытаюсь "./a .out ".
bash: ./a.out: Permission denied
Обходной путь для 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»), и вы должны иметь возможность выполнять двоичные файлы прямо оттуда.
Я бы сказал, что ваша программа не имеет функции «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
.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» на ваш идентификатор пользователя.
Обходной путь для 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»), и вы должны иметь возможность выполнять двоичные файлы прямо оттуда.
Я бы сказал, что ваша программа не имеет функции «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
.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» на ваш идентификатор пользователя.
Обходной путь для 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»), и вы должны иметь возможность выполнять двоичные файлы прямо оттуда.
Я бы сказал, что ваша программа не имеет функции «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
.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» на ваш идентификатор пользователя.