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