2012-02-28 8 views
11

में बाइनरी फ़ाइल कैसे चलाएं मेरे पास commanKT नामक एक फ़ाइल है और इसे एक लिनक्स टर्मिनल में चलाने की इच्छा है। क्या कोई इस फ़ाइल को चलाने के लिए आदेश देकर मदद कर सकता है? मैं ./commonRT कोशिश की, लेकिन मैं त्रुटि मिल रही है: अगर लेखन त्रुटि तो नहीं, तुम क्यों ./commonKT के बजाय ./commonRT उपयोग कर रहे हैंलिनक्स

"bash: ./commonrt: cannot execute binary file" 

[[email protected] MainApp]$ ls -al commonKT 
-rwxrwxr-x. 1 sijith sijith 10314053 Feb 27 16:49 commonKT 
+1

क्या आप वाकई निष्पादन योग्य हैं? कमांड 'फ़ाइल' – meteorgan

+4

का उपयोग करने का प्रयास करें समस्या मानना ​​नामों ('सामान्य' बनाम 'सामान्य केटी') पर सिर्फ एक मिश्रण नहीं है,' फ़ाइल सामान्य केटी/बिन/sh' कमांड क्या है? यदि यह दो अलग-अलग आर्किटेक्चर (शायद एआरएम के लिए एक और इंटेल के लिए एक) देता है, तो यही कारण है कि आप इंटेल मशीन पर एआरएम नहीं चला सकते हैं। –

+0

'file' का उपयोग करने के अलावा, मैं 'ldd' का उपयोग करने का भी सुझाव देता हूं; शायद गतिशील लिंकर या कुछ कोर साझा लाइब्रेरी अलग या गायब है .... –

उत्तर

5

यह वॉल्यूम noexec पर चढ़ाया गया है।

1

या, फ़ाइल एक फ़ाइल प्रकार और/या आर्किटेक्चर है जो आप अपने हार्डवेयर के साथ नहीं चल सकते हैं और/या किसी अन्य तरीके से विशेष प्रारूप को संभालने के लिए कोई फॉलबैक binfmt_misc प्रविष्टि भी नहीं है। निर्धारित करने के लिए file(1) का उपयोग करें।

18

बाइनरी निष्पादित करने के लिए, ./binary_name का उपयोग करें।

आप कोई त्रुटि मिलती है:

bash: ./binary_name: cannot execute binary file

क्योंकि यह एक उपकरण श्रृंखला है कि जो आप पर बाइनरी चलाने का प्रयास कर रहे हैं कि करने के लिए एक अलग लक्ष्य के लिए था का उपयोग कर संकलित किया गया था यह हो जाएगा।

उदाहरण के लिए, यदि आप arm-none-linux-gnueabi-gcc के साथ 'binary_name.c' संकलित करते हैं और x86 मशीन पर उत्पन्न बाइनरी चलाने का प्रयास करते हैं, तो आपको उपर्युक्त त्रुटि मिल जाएगी।

8

खोल से लिनक्स में एक द्विआधारी या .run फ़ाइल निष्पादित, डॉट फ़ॉरवर्ड स्लैश दोस्त

./binary_file_name 

का उपयोग करें और अगर यह क्योंकि अनुमतियों के कहना विफल रहता है, तो आप इसे क्रियान्वित करने

से पहले इस कोशिश कर सकते करने के लिए
chmod +x binary_file_name 
# then execute it 
./binary_file_name 

आशा है कि यह

2

यह है कि आप अपने निर्माण मेजबान बनाम अपने निष्पादन मेजबान पर असंगत वास्तुकला सेटिंग्स के साथ अपने द्विआधारी संकलित संभव है में मदद करता है। आप कृपया अपने निर्माण मेजबान पर के माध्यम से

g++ {all-your-build-flags-here} -Q -v --help=target 

सक्षम लक्ष्य सेटिंग्स पर एक नज़र हो सकता है? विशेष रूप से, COLLECT_GCC_OPTIONS चर आपको मूल्यवान डीबग जानकारी दे सकता है। तो फिर इस तरह के सीपीयू क्षमताओं में अपने निर्माण मेजबान पर -msse4.2 [enabled] लेकिन एक लापता sse4_2 ध्वज के रूप में बेमेल के लिए बाहर देखो के माध्यम से

cat /proc/cpuinfo | grep -m1 flags 

अपने निष्पादन मेजबान पर सीपीयू क्षमताओं पर एक नजर है।

यदि यह मदद नहीं करता है, तो कृपया ldd commonKT दोनों के निर्माण और निष्पादन होस्ट पर आउटपुट प्रदान करें।

+0

@craq मुझे लगता है कि आपने मुझे अपना उपहार दिया, धन्यवाद! क्या आप कृपया कुछ जानकारी दे सकते हैं कि त्रुटि क्या थी? – user1978011

2

यह @craq के लिए एक जवाब है:

I just compiled the file from C source and set it to be executable with chmod. There were no warning or error messages from gcc.

मैं थोड़ा हैरान हूँ कि आप था 'एक्ज़िक्यूटेबल में यह सेट' कर रहा हूँ - मेरे gcc हमेशा निष्पादन झंडा ही तय करता है। इससे मुझे पता चलता है कि gcc यह अंतिम निष्पादन योग्य फ़ाइल होने की उम्मीद नहीं करता था, या यह इस प्रणाली पर निष्पादन योग्य होने की अपेक्षा नहीं करता था।

अब मैं सिर्फ वस्तु फ़ाइल बनाने के लिए है, तो तरह की कोशिश की है:

$ gcc -c -o hello hello.c 
$ chmod +x hello 

(hello.c एक विशिष्ट "नमस्ते विश्व" कार्यक्रम है।) लेकिन मेरी त्रुटि संदेश थोड़ा अलग है:

$ ./hello 
bash: ./hello: cannot execute binary file: Exec format error` 

दूसरी ओर, इस तरह से, file आदेश के उत्पादन में तुम्हारा के समान है:

$ file hello 
hello: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped 

जबकि अगर मैं सही ढंग से संकलित करता हूं, तो इसका उत्पादन बहुत लंबा होता है।

$ gcc -o hello hello.c 
$ file hello 
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=131bb123a67dd3089d23d5aaaa65a79c4c6a0ef7, not stripped 

क्या मैं कह रहा हूँ है: मुझे लगता है जिस तरह से आप संकलित करके उसे अपने कोड लिंक के साथ कुछ है। हो सकता है कि आप कुछ प्रकाश डाल सकें कि आप ऐसा कैसे करते हैं?

0

यदि यह पहले टाइप किया गया है, तो यह टाइपो नहीं है, यह 64 बिट के तहत 64 बिट संकलित करने जैसे गलत कंपाइलर विकल्प हो सकता है। यह एक टूलचेन नहीं होना चाहिए।

1

एक ही तरीका है कि मेरे लिए काम करता (here से निकाली गई):

chmod a+x name_of_file.bin 

आप किसी अनुमति त्रुटि आप हो सकता है के साथ अपने आवेदन शुरू करने के लिए मिलता है, तो फिर

./name_of_file.bin 

लिख कर इसे चलाने रूट विशेषाधिकार:

sudo ./name_of_file.bin 
0

आपके संकलन विकल्प -c आपके संकलन को संकलन और असेंबली बनाता है, लेकिन कोई लिंक नहीं।

-1

बाइनरी फ़ाइल के लिए पूर्ण पथ। उदाहरण के लिए:/home/vitaliy2034/binary_file_name। या निर्देश "./+binary_file_name" का उपयोग करें। यूनिक्स सिस्टम में './' यह निर्देशिका के लिए पूर्ण पथ लौटाता है, जिसमें आप टर्मिनल (खोल) खोलते हैं। मुझे उम्मीद है कि यह मदद करता है। क्षमा करें, मेरी अंग्रेजी भाषा के लिए)