12

I have written a C++ program and complied it to produce a.out file. However, whenever I try to run it, I get Permission Denied. I read that we can use sudo, but I can't quite get it to work. I use something like, sudo "./a.out" but that too doesn't work.

Edit:

Here is the message I get when I try "./a.out".

bash: ./a.out: Permission denied
Bruno Pereira
  • 73,643
  • What is the output of ls -l a.out? What is the output of file a.out? Is the executable on a USB memory stick / Harddisk? – JRT May 23 '11 at 13:19
  • Its on Harddisk. Its the same file created soon after the the compilation process. I didn't set any other parameters. – Shamim Hafiz - MSFT May 23 '11 at 16:39
  • -rw------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out Is the output of ls -l a.out – Shamim Hafiz - MSFT May 23 '11 at 17:49
  • So based on the output of ls -l a.out it's a permissions problem. If you do chmod +x a.out then try ./a.out does it execute? What is the output of umask? – JRT May 23 '11 at 22:04
  • @JRT: It doesn't execute. Doing "chmod +x a.out" doesn't give any message, but looks like it has no effect. Trying "ls -l a.out" again still shows the same thing. – Shamim Hafiz - MSFT May 24 '11 at 05:32

6 Answers6

20

Usually, g++ gives the created file execute permissions. If you do not pass the -o option, the file will be named a.out.

Two possible reasons why your file does not have the execute bit set, with their solutions:

  1. The umask value is set to a value like 0133, thereby preventing the execute bit from being set. Solution: set the permissions explicitly:

    chmod 755 a.out
    
  2. The filesystem you're working on does not support Linux permissions. This could be the case if you're putting files on a FAT32-formatted flash drive. Solution: either back up the files and format it to ext2 or mount the drive with fmask=0022 or umask=0022 (omitting fmask). See the Mount options for fat section on the manual page of mount for more details.

For bash scripts which do not have the execute bit set, you could run bash file.sh. Such a feature exists for all files with executable content (compiled files and files with a shebang line #!/path/to/interpreter set). To execute files without the execute bit set, use the special file /lib/ld-linux.so.2 (or /lib/ld-linux-x86-64.so.2 for 64-bit applications) to run such a program:

/lib/ld-linux-x86-64.so.2 a.out
Zanna
  • 70,465
Lekensteyn
  • 174,277
  • This answer is more interesting, just to add, the way I Installed Ubuntu is over Windows and a folder named was created on C drive(windows installation drive). This drive is formatted as FAT32. Could this have something to do with that? – Shamim Hafiz - MSFT May 24 '11 at 05:55
  • 1
    You've done a Wubi installation (C:\Ubuntu had been created). This should not be a problem unless you're putting files on "C:" and not your Ubuntu installation. If you're not using Windows, or have plenty of disk space, I suggest installing Ubuntu on a dedicated partition. And again, NTFS / FAT32 does NOT support Linux permissions, so you can run sudo chown user file, chmod 755 file, it won't work. You really need an EXT filesystem for that. – Lekensteyn May 24 '11 at 08:08
  • Actually I am saving the file on D drive, which I access through media/DOCS/workfolder. This work folder along with all other D drive folders are visible inside media/DOCs. Could this be the reason? – Shamim Hafiz - MSFT May 24 '11 at 08:12
  • 3
    The same story, none of Windows filesystems supports Linux file permissions. You should put the files on a filesystem formatted EXT. – Lekensteyn May 24 '11 at 08:17
  • 1
    So simply working on a folder that belongs to Ubuntu should do the trick, right? I mean, I should not use folders that are not part of Ubuntus File System Structure? – Shamim Hafiz - MSFT May 24 '11 at 08:38
  • 3
    Exactly, just stay in ~, I create ~/projects and put all my projects in it, you could do the same thing. – Lekensteyn May 24 '11 at 08:46
  • Mine was the second case. I haven't tried it out on ext4 but at least I know what's wrong! :D – Aaron John Sabu Mar 28 '20 at 21:26
5

Just copy the folder to your home folder and it will work. You are probably trying to run it on an external drive or something.

  • "just copy the folder to your home folder and it will work" this worked for me. Thanks. Though it seems weird as the file is exectuable. – Mohamad Fakih May 08 '20 at 03:24
5

.out is an unusual extension. Usually this would normally signify a "trace output" file.

Check your syntax that you are using to compile

e.g.

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

or maybe

g++ myfile.cpp -lm -o outputfilename

You can should examine to see if the executable bit is set on the file

ls -l a.out

or you can just force the executable bit

chmod +x a.out

then you can run your file

./a.out

or simply

a.out

You should also perhaps check that the output file has been written correctly as a binary

i.e.

file a.out

This will report what format the file is - either a script or a binary

You rarely need to execute as root unless you have restricted who should be able to run the executable.

If you have compiled as root (e.g. sudo make), or have a Makefile that installed the executable as root then can I suggest you regain the permission as the user logged in

i.e.

sudo chown fred:fred a.out

i.e. replace "fred" with your user id.

fossfreedom
  • 172,746
  • Thanks for the information. I am actually logged in as the only user, and I presume I am the main user. I am not quite sure, why I need to use administrative authentication anyway. How would I be able to remove this option so I can always run the files. – Shamim Hafiz - MSFT May 23 '11 at 12:33
  • updated - hopefully to clarify and answer your question. – fossfreedom May 23 '11 at 12:40
  • a.out is a legacy feature of the compiler so it produces a predictable filename if you didn't ask for one. This is not a permissions problem, but a misunderstanding of how compilers and C++ work. – SpamapS May 23 '11 at 12:43
  • Linux/Unix does not rely on file extensions to determine the file-type. Normally executable files have no extension at all. Also, the format to executable a file does not differ between shells generally. All shells should work find with ./a.out unless it is some exotic shell. – JRT May 23 '11 at 12:54
  • I'd bet it's as simple as fixing the executable bit like you said: chmod +x a.out. – hometoast May 23 '11 at 13:47
  • I tried "chmod +x a.out" but no luck. I have updated my question to include the error message. – Shamim Hafiz - MSFT May 23 '11 at 17:52
  • Even trying "sudo chown fred:fred a.out" with proper name brought no luck. – Shamim Hafiz - MSFT May 23 '11 at 17:55
  • 1
    Gunner - please copy and paste the complete output in the terminal starting with your compile command, followed by the ls -l, chmod +x and finally the execution. Please confirm your name by typing "whoami" – fossfreedom May 23 '11 at 18:32
0

on Zorin/Ubuntu I get this..

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

bash: ./main.out: Permission denied

I had to move my whole REPO from the USB drive to the SSD.

On USB, I could not get it to be executable. Now works without the chmod.

0

The workaround for FAT-filesystems in the first answer

"This could be the case if you're putting files on a FAT32-formatted flash drive. Solution: (...) mount the drive with fmask=0022 or umask=0022 (omitting fmask)."

normally does not work - the default for umask is mostly 0022 anyway, so this does not change anything.

Another mount parameter's default, however, effectively disallows execution of binaries, especially if the FAT-filesystem is mounted as non-root-user: noexec

So just mount FAT-formatted drives with the option exec like so:

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

(this must normally be done as root, hence the "sudo") and you should be able to execute binaries directly from there.

wolfy
  • 1
-2

I'd wager that your program does not have a 'main()' function, as if it did, your compiler would have made a.out executable. Right now it is just an object file full of code, but there's no entry point. main() is a special function name in C and C++ that tells the compiler to create a program rather than just object files which can be linked to a program or library.

I'd be interested to know what command line you used to produce this file, as GNU GCC's c++ compiler, g++, will not let me create a simple program w/o a main function:

#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

However if I make change 'void no_main' to 'int main' it works:

$ g++ hello.cc
$ ./a.out
Hello World
SpamapS
  • 19,820
  • 5
    If he had no main function, it would not link and therefore it would not produce an a.out file. – JRT May 23 '11 at 13:11