2011-12-22 5 views
9

मैं इसे इन प्रक्रियाओं का पालन करते हुए पर Android ऑपरेटिंग सिस्टम चलाने बनाने के लिए नीचे एक नमूना सी कोड तैयार किया है,आप एंड्रॉइड के लिए ईएलएफ निष्पादन योग्य संकलन कैसे पार करते हैं?

/*test.c file*/ 
#include <stdio.h> 

int 
main(int argc, char **argv) 
{ 
    printf("Android Test Application.\n"); 
    return 0; 
} 

$ हाथ-नन-linux-gnueabi-जीसीसी -ओ परीक्षण test.c -Wall

मैंने बाइनरी फ़ाइल --test-- को लक्षित डिवाइस "/ system/bin" निर्देशिका में कॉपी किया।

जब मैं लक्ष्य सिस्टम पर पार संकलित बाइनरी रन बनाने के लिए प्रयास करते हैं, मैं इस त्रुटि हो रही है

$ पीडब्ल्यूडी

/system/बिन

$ ./test

बैश: ./test: ऐसी कोई फ़ाइल या निर्देशिका

$ ls -al | ग्रेप परीक्षण

-rwxr-XR-एक्स 1 0 0 8384 2011-12-22 15:26 परीक्षण

हालांकि बाइनरी फ़ाइल --test-- "/ system/बिन" निर्देशिका में पहले से ही है ।

मेरे पार संकलक

$ हाथ-नन-linux-gnueabi-जीसीसी है --version

हाथ-नन-linux-gnueabi-जीसीसी (Sourcery जी ++ लाइट 2009q1-203) 4.3 .3 कॉपीराइट (सी) 2008 फ्री सॉफ्टवेयर फाउंडेशन, इंक। यह सॉफ़्टवेयर है; शर्तों की प्रतिलिपि बनाने के लिए स्रोत देखें। कोई वारंटी नहीं है; किसी विशेष प्रयोजन के लिए व्यापारिकता या फिटनेस के लिए भी नहीं।

मुझे यह त्रुटि क्यों मिल रही है?

बैश: ./test: ऐसी कोई फ़ाइल या निर्देशिका

+1

_could_ एक लापता हो/बुरी तरह से जुड़े गतिशील लोडर या उस तरह कुछ। पता लगाएं कि लोडर 'रीडल्फ' के साथ क्या है। डिवाइस पर 'ldd।/Test' आज़माएं। यह देखने के लिए कि कम से कम काम करता है या नहीं, यह देखने के लिए exe को स्थिर-लिंक करने का भी प्रयास करें। – Mat

+0

'ls -al | चल रहा है मेरे फोन पर grep date' अनुमतियों के रूप में 'lrwxrwxrwx' पैदा करता है। शायद यह एक अनुमति मुद्दा है? –

+1

मैं अपने वर्तमान गतिशील लोडर का पता कैसे लगा सकता हूं? क्या मैं इसे सीखने के लिए पठनीय उपयोगिता का उपयोग कर सकता हूं? – albin

उत्तर

16

यह समस्या गतिशील लोडर से संबंधित था। जब मैंने रीडलाइन के साथ बाइनरी फ़ाइल के आउटपुट की जांच की, तो मैंने अधिसूचित किया कि मेरे द्वारा उपयोग किए जाने वाले क्रॉस-कंपाइलर में एक अलग प्रकार का डिफ़ॉल्ट गतिशील लोडर है - "/lib/ld-linux.so.3", लेकिन एंड्रॉइड "/ सिस्टम का उपयोग करता है/bin/संयोजक "

$ readelf --program-headers test 

Elf file type is EXEC (Executable file) 
Entry point 0x8380 
There are 8 program headers, starting at offset 52 
    Program Headers: 
Type   Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 
EXIDX   0x0004fc 0x000084fc 0x000084fc 0x00050 0x00050 R 0x4 
PHDR   0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4 
INTERP   0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1 
     [Requesting program interpreter: /lib/ld-linux.so.3] 
LOAD   0x000000 0x00008000 0x00008000 0x00550 0x00550 R E 0x8000 
LOAD   0x000550 0x00010550 0x00010550 0x00124 0x00128 RW 0x8000 
DYNAMIC  0x00055c 0x0001055c 0x0001055c 0x000f0 0x000f0 RW 0x4 
NOTE   0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4 
GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 

क्रम गतिशील लोडर (गतिशील लिंकर) बदलने के लिए," --dynamic-लिंकर =/path// लोडर करने के लिए "लिंकर के लिए इस्तेमाल किया जाना चाहिए।

$ हाथ-नन-linux-gnueabi-जीसीसी -ओ परीक्षण test.c -Wall -Wl, - गतिशील-लिंकर =/प्रणाली/bin/लिंकर

+2

एंड्रॉइड में पुनर्प्राप्ति फ़ाइल सिस्टम के लिए बाइनरी संकलित करना बहुत उपयोगी है जहां कोई सिस्टम/बिन/लिंकर उपलब्ध नहीं है और पथ को फिर से परिभाषित किया जाना है। धन्यवाद। –

संबंधित मुद्दे