.Out dosyaları yürütülemiyor, izin reddedildi


11

Bir C ++ programı yazdım ve bir.out dosyası üretmek için uydum. Ancak, ne zaman çalıştırmaya çalışsam, İzin Verilmez. Sudo kullanabileceğimizi okudum ama işe yarayamıyorum. Sudo "./a.out" gibi bir şey kullanıyorum ama bu da işe yaramıyor.

Düzenle :

İşte "./a.out" komutunu denediğimde alacağım mesaj.

bash: ./a.out: Permission denied

Ls -l a.out çıktı nedir ? A.out dosyasının çıktısı nedir ? Bir USB bellek / Harddisk üzerindeki yürütülebilir dosya mı?
JRT

Harddisk üzerinde. Derleme işleminden hemen sonra oluşturulan aynı dosya. Başka parametre belirlemedim.
Şamim Hafız

-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out ls çıktı -l a.out
Şamim Hafız

Yani ls -l a.out çıktısına dayalı bir izin sorunu var. Bunu yaparsanız chmod + x a.out sonra deneyin ./a.out o çalıştırıyor? Umask çıktısı nedir ?
JRT

@JRT: Çalışmıyor. "Chmod + x a.out" yapmak herhangi bir mesaj vermez, ancak hiçbir etkisi yoktur. Tekrar "ls -l a.out" denemek hala aynı şeyi gösterir.
Şamim Hafız

Yanıtlar:


19

Genellikle, g++oluşturulan dosya yürütme izinlerini verir. Eğer geçmek yoksa -oseçeneği, dosya adında olacak a.out.

Dosyanızın çözümleriyle yürütme biti ayarlamamasının iki olası nedeni:

  1. Umask değeri böylece grubu olmaktan çalıştırmak bit önler 0133 gibi bir değere ayarlanır. Çözüm: İzinleri açıkça ayarlayın:

    chmod 755 a.out
    
  2. Üzerinde çalıştığınız dosya sistemi Linux izinlerini desteklemiyor. Dosyaları FAT32 biçimli bir flash sürücüye yerleştiriyorsanız durum böyle olabilir. Çözüm: dosyaları yedekleyin ve ext2 olarak biçimlendirin veya sürücüyü fmask=0022veya umask=0022(atlayarak fmask) ile bağlayın . Bkz yağ için Dağı seçenekleri bölüm mount kılavuz sayfasında daha fazla ayrıntı için.

Yürütme biti ayarlanmamış bash komut dosyaları için çalıştırabilirsiniz bash file.sh. Böyle bir özellik, yürütülebilir içeriğe sahip tüm dosyalar için (derlenmiş dosyalar ve bir shebang satır #!/path/to/interpreterkümesine sahip dosyalar ) mevcuttur. Yürütme biti ayarlanmamış dosyaları yürütmek için, bu tür bir programı çalıştırmak üzere özel dosyayı /lib/ld-linux.so.2(veya /lib/ld-linux-x86-64.so.264 bit uygulamalar için) kullanın:

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

Bu cevap, daha ilginçtir, sadece Ubuntu'yu yüklediğim yolu Windows üzerinde ve C sürücüsünde (windows kurulum sürücüsü) adlı bir klasör oluşturuldu. Bu sürücü FAT32 olarak biçimlendirilmiş. Bunun bununla bir ilgisi olabilir mi?
Şamim Hafız

1
Bir Wubi kurulumu yaptınız ( C:\Ubuntuoluşturulmuştu). Ubuntu kurulumunuzu değil "C:" üzerine dosya koymazsanız bu bir sorun olmamalıdır. Windows kullanmıyorsanız veya çok fazla disk alanınız varsa, Ubuntu'yu özel bir bölüme yüklemenizi öneririm. Ve yine, NTFS / FAT32 Linux izinlerini DESTEKLEMEZ, böylece çalıştırabilirsiniz sudo chown user file, chmod 755 fileçalışmaz. Bunun için gerçekten bir EXT dosya sistemine ihtiyacınız var.
Lekensteyn

3
Aynı hikaye, Windows dosya sistemlerinin hiçbiri Linux dosya izinlerini desteklemiyor. Dosyaları EXT olarak biçimlendirilmiş bir dosya sistemine koymalısınız.
Lekensteyn

1
Yani sadece Ubuntu'ya ait bir klasör üzerinde çalışmak hile yapmalı, değil mi? Yani, Ubuntus Dosya Sistemi Yapısı'nın bir parçası olmayan klasörleri kullanmamalıyım?
Shamim Hafiz

3
Kesinlikle, sadece kal ~, ~/projectsbütün projelerimi yaratıp içine koydum, aynı şeyi yapabilirsin.
Lekensteyn

5

.out alışılmadık bir uzantı. Genellikle bu normalde bir "izleme çıktısı" dosyasını gösterir.

Derlemek için kullandığınız sözdizimini kontrol et

Örneğin

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

ya da belki

g++ myfile.cpp -lm -o outputfilename

Yürütülebilir bitin dosyada ayarlanıp ayarlanmadığını incelemeniz gerekir

ls -l a.out

veya sadece yürütülebilir biti zorlayabilirsiniz

chmod +x a.out

o zaman dosyanızı çalıştırabilirsiniz

./a.out

ya da sadece

a.out

Ayrıca çıktı dosyasının ikili olarak doğru yazıldığını da kontrol etmelisiniz.

yani

file a.out

Bu, dosyanın ne biçim olduğunu bildirir - bir komut dosyası veya ikili dosya

Yürütülebilir dosyayı kimin çalıştırabileceğini kısıtlamadığınız sürece nadiren root olarak yürütmeniz gerekir.

Kök olarak derlediyseniz (örn. Sudo make) veya yürütülebilir dosyayı root olarak yükleyen bir Makefile'niz varsa, kullanıcı oturum açtığında izni yeniden almanızı öneririm

yani

sudo chown fred:fred a.out

yani "fred" yerine kullanıcı kimliğinizi yazın.


Bilgi için teşekkürler. Aslında tek kullanıcı olarak oturum açtım ve ana kullanıcı olduğumu varsayıyorum. Neden yönetici kimlik doğrulaması kullanmam gerektiğinden tam olarak emin değilim. Dosyaları her zaman çalıştırabilmek için bu seçeneği nasıl kaldırabilirim.
Şamim Hafız

güncellendi - umarım sorunuzu netleştirmek ve cevaplamak için.
fossfreedom

a.out, derleyicinin eski bir özelliğidir, bu nedenle siz istemediyseniz tahmin edilebilir bir dosya adı üretir. Bu bir izin sorunu değil, derleyicilerin ve C ++ 'ın nasıl çalıştığının yanlış anlaşılmasıdır.
SpamapS

Linux / Unix, dosya türünü belirlemek için dosya uzantılarına güvenmez. Normalde yürütülebilir dosyaların hiç uzantısı yoktur. Ayrıca, bir dosyayı yürütülebilir format genellikle kabuklar arasında farklılık göstermez. Egzotik bir kabuk olmadıkça tüm mermiler ./a.out ile bulmaya çalışmalıdır .
JRT

1
Topçu - lütfen derleme komutunuzdan başlayarak terminaldeki tüm çıktıyı kopyalayıp yapıştırın, ardından ls -l, chmod + x ve son olarak yürütme. Lütfen adınızı "whoami" yazarak onaylayın
fossfreedom

4

klasörü ana klasörünüze kopyalamanız yeterlidir. Muhtemelen harici bir sürücüde çalıştırmaya çalışıyorsunuz.


0

İlk yanıtta FAT dosya sistemleri için geçici çözüm

"Dosyaları FAT32 biçimli bir flash sürücüye yerleştiriyorsanız durum böyle olabilir. Çözüm: (...) sürücüyü fmask = 0022 veya umask = 0022 (atlama fmask) ile bağlayın."

normalde çalışmaz - umask için varsayılan değer zaten 0022'dir, bu nedenle bu hiçbir şeyi değiştirmez.

Bununla birlikte, başka bir mount parametresinin varsayılan değeri, özellikle FAT dosya sistemi kök kullanıcı olmayan olarak monte edilmişse, ikili dosyaların yürütülmesine etkin bir şekilde izin vermez: noexec

FAT formatlı sürücüleri aşağıdaki seçenekle monte edin exec:

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

(bu normalde kök olarak yapılmalıdır, dolayısıyla "sudo") ve ikili dosyaları doğrudan oradan yürütebilirsiniz.


-2

Programınızın bir 'main ()' işlevi olmadığından bahsetmiştim, sanki derleyiciniz bir.out yürütülebilir dosyası yapmış olurdu. Şu anda kodla dolu bir nesne dosyası, ancak giriş noktası yok. main (), C ve C ++ 'da derleyiciye yalnızca bir programa veya kitaplığa bağlanabilen nesne dosyaları yerine bir program oluşturmasını söyleyen özel bir işlev adıdır.

GNU GCC'nin c ++ derleyicisi, g ++, ana işlevi w / oa olan basit bir program oluşturmama izin vermeyeceğinden, bu dosyayı üretmek için hangi komut satırını kullandığınızı bilmek isterim:

#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

Ancak 'int main' için 'void no_main' değiştirirseniz çalışır:

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

5
O hayır olsaydı ana işlevi, bu bağlantı olmaz ve bu nedenle bir üretmek olmaz a.out dosyasını.
JRT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.