.outファイルを実行できず、アクセス許可が拒否されました


11

C ++プログラムを作成し、それをコンパイルしてa.outファイルを作成しました。ただし、実行しようとすると、許可が拒否されます。私はsudoを使用できると読みましたが、うまく動作させることができません。sudo "./a.out"のようなものを使用しますが、それも機能しません。

編集

「./a.out」を試すと表示されるメッセージを次に示します。

bash: ./a.out: Permission denied

ls -l a.outの出力は何ですか?ファイルa.outの出力は何ですか?実行可能ファイルはUSBメモリスティック/ハードディスクにありますか?
JRT

そのハードディスク上。コンパイルプロセスの直後に作成された同じファイル。他のパラメーターは設定していません。
シャミムハフィズ

-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22午後11時30 a.outがLS -lのa.outの出力です
Shamimハーフィズ

したがって、ls -l a.outの出力に基づくと、これはパーミッションの問題です。そうした場合はchmod + Xのa.out、その後試す./a.outそれが実行しますか?umaskの出力は何ですか?
JRT

@JRT:実行されません。「chmod + x a.out」を実行してもメッセージは表示されませんが、効果はないようです。「ls -l a.out」をもう一度試しても、同じことがわかります。
シャミムハフィズ

回答:


18

通常、g++作成されたファイルに実行許可を与えます。-oオプションを渡さない場合、ファイルの名前はになりますa.out

ファイルに実行ビットが設定されていない2つの理由とその解決策:

  1. umaskの値は、それによってセットされてから実行ビットを防止する、0133のような値に設定されています。解決策:許可を明示的に設定します。

    chmod 755 a.out
    
  2. 作業中のファイルシステムはLinuxの許可をサポートしていません。これは、FAT32形式のフラッシュドライブにファイルを配置する場合に該当する可能性があります。解決策:ファイルをバックアップしてext2にフォーマットするか、fmask=0022またはumask=0022(省略fmask)でドライブをマウントします。詳細については、マウントマニュアルページの「脂肪マウントオプション」セクションを参照してください。

実行ビットが設定されていないbashスクリプトの場合、実行できますbash file.sh。このような機能は、実行可能コンテンツを含むすべてのファイル(コンパイルされたファイルおよびシェバン行#!/path/to/interpreterセットを持つファイル)に存在します。実行ビットを設定せずにファイルを実行するには、特別なファイル/lib/ld-linux.so.2(または/lib/ld-linux-x86-64.so.264ビットアプリケーション用)を使用してこのようなプログラムを実行します。

/lib/ld-linux-x86-64.so.2 a.out

この答えはもっと面白いです、追加するだけで、Ubuntuをインストールした方法はWindows上であり、という名前のフォルダがCドライブ(Windowsインストールドライブ)に作成されました。このドライブはFAT32としてフォーマットされています。これには何か関係があるのでしょうか?
シャミムハフィズ

1
Wubiのインストールが完了しました(C:\Ubuntu作成済み)。Ubuntuインストールではなく「C:」にファイルを配置しない限り、これは問題になりません。Windowsを使用していない場合、または十分なディスク容量がある場合は、専用パーティションにUbuntuをインストールすることをお勧めします。そして再び、NTFS / FAT32は、Linuxのパーミッションをサポートしていないので、あなたが実行することができsudo chown user filechmod 755 fileそれは動作しません。そのためには、EXTファイルシステムが本当に必要です。
-Lekensteyn

3
同じ話ですが、WindowsファイルシステムはどれもLinuxファイル許可をサポートしていません。EXTでフォーマットされたファイルシステムにファイルを配置する必要があります。
-Lekensteyn

1
したがって、Ubuntuに属するフォルダーで作業するだけでうまくいくはずです。つまり、Ubuntus File System Structureの一部ではないフォルダーを使用すべきではないということですか?
シャミムハフィズ

3
正確に、そのままにとどまり、すべてのプロジェクト~を作成~/projectsしてそこに入れます。同じことができます。
-Lekensteyn

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として実行する必要はほとんどありません。

ルートとしてコンパイルした場合(例:sudo make)、またはルートとして実行可能ファイルをインストールしたMakefileがある場合、ユーザーがログインしたときに権限を取り戻すことをお勧めします

すなわち

sudo chown fred:fred a.out

つまり、「fred」をユーザーIDに置き換えます。


情報のおかげで。私は実際に唯一のユーザーとしてログインしており、自分がメインユーザーであると想定しています。とにかく管理認証を使用する必要がある理由はよくわかりません。いつでもファイルを実行できるように、このオプションを削除するにはどうすればよいでしょうか。
シャミムハフィズ

更新-できれば質問を明確にして回答してください。
fossfreedom

a.outはコンパイラのレガシー機能であるため、要求しない場合は予測可能なファイル名を生成します。これは権限の問題ではなく、コンパイラとC ++の動作の誤解です。
SpamapS

Linux / Unixは、ファイル拡張子をファイルタイプに依存していません。通常、実行可能ファイルには拡張子はありません。また、ファイルを実行可能にする形式は、一般的にシェル間で異なりません。何らかのエキゾチックなシェルでない限り、すべてのシェルは./a.outで findが機能するはずです。
JRT

1
Gunner-コンパイルコマンドで始まり、ls -l、chmod + x、最後に実行が続くターミナルに完全な出力をコピーして貼り付けてください。「whoami」と入力して名前を確認してください
fossfreedom

4

フォルダーをホームフォルダーにコピーするだけで機能します。外付けドライブなどで実行しようとしている可能性があります。


0

最初の答えのFATファイルシステムの回避策

「これは、FAT32フォーマットのフラッシュドライブにファイルを配置する場合に該当する可能性があります。解決策:(...)ドライブをfmask = 0022またはumask = 0022(fmaskを省略)でマウントします。

通常は機能しません-umaskのデフォルトはほとんど0022であるため、これは何も変更しません。

ただし、特にFATファイルシステムが非rootユーザーとしてマウントされている場合、別のマウントパラメーターのデフォルトは、事実上、バイナリの実行を許可しません。 noexec

そのexecため、次のようなオプションでFATフォーマットのドライブをマウントするだけです。

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

(これは通常、root、つまり「sudo」として実行する必要があります)、そこからバイナリを直接実行できるはずです。


-2

あなたのプログラムが '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

ただし、「void no_main」を「int main」に変更すると機能します:

$ g++ hello.cc
$ ./a.out
Hello World

5
彼がメイン関数を持っていなかった場合、それはリンクせず、したがってa.outファイルを生成しません。
JRT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.