2012-09-20 12 views
7

के लिए क्रॉस-कंपाइलिंग मैं एम्बेडेड (कस्टम) एआरएम-आधारित लिनक्स सिस्टम के लिए कुछ सी कोड संकलित करने का प्रयास करता हूं। मैंने एक उबंटू वीएम स्थापित किया जिसमें एक क्रॉस-कंपाइलर है जिसे आर्म-लिनक्स-gnueabi-gcc-4.4 नाम दिया गया था क्योंकि ऐसा लगता था कि मुझे क्या चाहिए था। अब जब मैं इस जीसीसी के साथ अपने कोड संकलन, तो वह ऐसा एक द्विआधारी पैदा करता है:एम्बेडेड एआरएम-आधारित लिनक्स सिस्टम

$ file test1 
test1: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked 
(uses shared libs), for GNU/Linux 2.6.31, 
BuildID[sha1]=0x51b8d560584735be87adbfb60008d33b11fe5f07, not stripped 

जब मैं एम्बेडेड लिनक्स पर इस बाइनरी चलाने का प्रयास, मैं

$ ./test1 
-sh: ./test1: not found 

अनुमतियां पर्याप्त हैं। मैं केवल कल्पना कर सकते हैं कि कुछ द्विपदीय प्रारूप के साथ गलत है, तो मैं संदर्भ के रूप में कुछ काम कर बाइनरी को देखा:

$ file referenceBinary 
referenceBinary: ELF 32-bit LSB executable, ARM, version 1, dynamically linked 
(uses shared libs), stripped 

मैं वहाँ कुछ मतभेद हैं कि देखते हैं, लेकिन मैं प्राप्त करने के लिए मैं वास्तव में क्या जरूरत है ज्ञान की जरूरत नहीं है ठीक करने के लिए और मैं इसे कैसे ठीक कर सकता हूं। क्या कोई समझा सकता है कि कौन सा अंतर महत्वपूर्ण है?

एक और बात मैं को देखा निर्भरता हैं:

$ ldd test1 
    libc.so.6 => not found (0x00000000) 
    /lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000) 

(दिलचस्प है, इस लक्ष्य सिस्टम पर काम करता है, हालांकि यह द्विआधारी पर अमल नहीं कर सकते।) एम्बेडेड प्रणाली केवल एक libc.so.0 उपलब्ध है। मुझे लगता है कि मुझे संकलक को libc संस्करण को बताने की ज़रूरत है जिसे मैं लिंक करना चाहता हूं, लेकिन जैसा कि मैं इसे समझता हूं, जीसीसी सिर्फ उस संस्करण के खिलाफ लिंक करता है, यह सही है? मैं इसमें क्या कर सकता हूँ?

संपादित करें:

CC=/usr/bin/arm-linux-gnueabi-gcc-4.4 
STRIP=/usr/bin/arm-linux-gnueabi-strip   
CFLAGS=-I/usr/arm-linux-gnueabi/include    
LDFLAGS=-nostdlib 
LDLIBS=../libc.so.0 

SRCS=test1.c 
OBJS=$(subst .c,.o,$(SRCS)) 

all: test1 

test1: $(OBJS) 
    $(CC) $(LDFLAGS) -o main $(OBJS) $(LDLIBS) 
    $(STRIP) main 

depend: .depend 

.depend: $(SRCS) 
    rm -f ./.depend 
    $(CC) $(CFLAGS) -MM $^>>./.depend; 

clean: 
    rm -f $(OBJS) 

include .depend 
+0

यदि आप स्मृति पर तंग हैं, तो बहुत छोटा 'uClibc'' glibc' के लिए प्रतिस्थापित कर सकता है। हालांकि आपको 'uClibc' का उपयोग करने के लिए बनाया गया * gcc * कंपाइलर चाहिए। * Gcc *, * uClibc * (या * glibc *) के कामकाजी टूलचेन प्राप्त करने की एक (अपेक्षाकृत) आसान विधि और मित्रों के साथ-साथ लिनक्स कर्नेल, Busybox और अन्य संकुल का निर्माण स्रोत से सभी 'BuildRoot' का उपयोग करना है। एक अच्छा कंपाइलर + libc संयोजन के साथ, आप अपने ऐप को स्थिर रूप से लिंक कर सकते हैं, और लक्ष्य के पुस्तकालयों से स्वतंत्र हो सकते हैं। – sawdust

उत्तर

4

क्या आप शायद करना चाहिए एम्बेडेड सिस्टम पर libc6 स्थापित करने के लिए है: यहाँ Makefile मैं उपयोग करते हैं। एक ही समस्या के बारे में this thread पढ़ें। # 5 पोस्ट में समाधान स्थापित करने के लिए किया गया था:

libc6_2.3.6.ds1-13etch9_arm.deb 
linux-kernel-headers_2.6.18-7_arm.deb 
libc6-dev_2.3.6.ds1-13etch9_arm.deb 

आपका दूसरा विकल्प अपने वी एम पर एम्बेडेड सिस्टम से libc मिलता है और फिर इसे gcc लिंकर को पारित और -static विकल्प का उपयोग करने के लिए है।

इस समाधान का उपर्युक्त धागे में भी उल्लेख किया गया था। स्थिर लिंकिंग here के बारे में और पढ़ें।

तुएं:

this thread में वे अपने makefile से -mabi=apcs-gnu झंडा निकालने की सलाह यदि आप एक का उपयोग कर रहे हैं।

This article यदि आप कमांड लाइन से संकलित कर रहे हैं तो -nostdlib ध्वज फीडेंट जीसीसी सुझाता है।

या आप arm-none-eabi-gcc कंपाइलर का उपयोग करने के लिए स्विच कर सकते हैं। इस पर संदर्भ here और here पाया जा सकता है।

+0

मैं एम्बेडेड सिस्टम पर सॉफ़्टवेयर इंस्टॉल नहीं कर सकता, लेकिन सिस्टम के libc से लिंक करने से यह त्रुटि सामने आई: 'ld: त्रुटि: स्रोत ऑब्जेक्ट ../libc.so.0 में EABI संस्करण 0 है, लेकिन मुख्य लक्ष्य में EABI संस्करण 5' है। इस त्रुटि के लिए Google परिणाम का अर्थ है कि मुझे वास्तव में एक अलग जीसीसी की आवश्यकता है, क्या यह सही है? – flyx

+0

@flyx क्या आप मेकफ़ाइल का उपयोग कर रहे हैं या आप सीधे कमांड लाइन पर जीसीसी चला रहे हैं? –

+0

@flyx अन्य चीजों के लिए संपादित करने के लिए प्रयास करें जो उपयोगी हो सकता है –

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