2009-08-07 13 views
10

एक समान (कम वर्णनात्मक) पोस्ट here है।बिल्डिंग एआरएम जीएनयू क्रॉस कंपाइलर

मैं उबंटू पर हालिया रिलीज का उपयोग करके अपनी खुद की टूल श्रृंखला रोल करने की कोशिश कर रहा हूं और उम्मीद कर रहा था कि वहां एक लिनक्स समुदाय पर्याप्त था कि मैं कुछ समस्याओं पर विशिष्ट सलाह प्राप्त कर सकता हूं।

हर किसी की मदद से मैं इस बारी को एक उपयोगी संदर्भ में देखना चाहता हूं।

पहले "Crosstool" से पहले जो लगभग हर किसी को संदर्भित करता है, एक छोटी (2006) पुरानी है और "Crosstool-NG" जो अब लगता है कि मशाल ले जा रहा है मेरी मशीन पर विफल रहता है। मैं एक स्क्रिप्ट से खुद को प्रक्रिया को डीबग करना चाहता हूं (जो मुझे लगता है कि मुझे प्रक्रिया को समझने की आवश्यकता है)।

नीचे जो काम कर रहा है उसके नीचे मूल कदम हैं; वर्तमान में मैं पहले पास जीसीसी संकलित करने की कोशिश कर रहा हूं।

यह कहाँ में नाकाम रहने के है ...

क्योंकि पार संकलित पुस्तकालय "crti.o" युक्त यह नाकाम रहने है याद आ रही है:

# ./gcc-4.4.1/configure --target=arm-linux --disable-thread --enable-langauges=c 
/bin/bash ../../../gcc-4.4.1/libgcc/../mkinstalldirs . 
/usr/src/gnu-4.4.1-build/./gcc/xgcc -B ........ 
/usr/local/arm-linux/bin/ld: crti.o No such file: No such file or directory 
collect2: ld returned 1 exit status 
make[2]: *** [libgcc_s.so] Error 1 
make[2]: Leaving directory `/usr/src/gnu/gcc-4.4.1-build/arm-linux/libgcc' 
make[1]: *** [all-target-libgcc] Error 2 
make[1]: Leaving directory `/usr/src/gnu/gcc-4.4.1-build' 
make: *** [all] Error 2 

बिल्ड कदम

पर एक 'ताजा' कॉन्फ़िगर किया गया उबंटू 9.04 इंस्टॉलेशन, यहां तक ​​कि मैंने अभी तक किए गए कदम हैं:

#New configuration of Ubuntu 9.04 
sudo updatedb 
sudo apt-get install build-essential subversion 
# For kernel configuration 
sudo apt-get install libncurses5-dev 
# For building GCC 
sudo apt-get install libgmp3-dev libmpfr-dev 

#Get Linux Headers for GCC/GLIBC compilations 
# I use a hacked Linux from Artilla, 
pushd ~ && svn co http://.../linux m501-linux && cd !$ 
make ARCH=arm m501_defconfig 
make ARCH=arm menuconfig 
sudo mkdir /usr/local/arm-linux/include 
sudo cp -dR include/asm-arm /usr/local/arm-linux/include/asm 
sudo cp -dR include/linux /usr/local/arm-linux/include/linux 
cd /usr/local/arm-linux/ 
sudo ln -s include sys-include 
popd 

#Get sources: 
cd /usr/src/ 
sudo su root 
mkdir gnu 
ftp ftp.gnu.org 
# get gnu/binutils/binutils-2.19.1.tar.bz2 
# get gnu/gcc/gcc-4.4.1/gcc-4.4.1.tar.bz2 
# get gnu/glibc/glibc-2.10.1.tar.bz2 
# get gnu/gdb/gdb-6.8.tar.bz2 

#Build Binutils 
bzcat binutils-2.19.1.tar.bz2 | tar -xv 
mkdir binutils-2.19.1-build && cd !$ 
cp ../binutils-2.19.1/gas/config/tc-arm.c ./tc-arm.c 
sed -r 's/(as_bad[ \t]*\()(.+\[.+\]\))/\1\"%s\",\2/' < ./tc-arm.c > ../binutils-2.19.1/gas/config/tc-arm.c 
rm ./tc-arm.c  
../binutils-2.19.1/configure --target=arm-linux 
make && make install && cd .. 

#Build GCC 
bzcat gcc-4.4.1.tar.bz2 | tar -xv 
mkdir gcc-4.4.1-build && cd !$ 
../gcc-4.4.1/configure --target=arm-linux --disable-thread --enable-langauges=c -with-headers=/usr/local/arm-linux/include 
make 
+0

पेंगुइन, पेंगुइन .. हर जगह! :) –

+0

क्षमा करें, मैंने आपके प्रश्न को गलत तरीके से पढ़ा है, मुझे लगता है कि आप जानते थे कि सही libc गंतव्य होस्ट पर मौजूद होगा .. और आप बस एक विदेशी वास्तुकला पर संकलन कर रहे थे। खैर, कम से कम, अब आपके पास एक एआरएम उपकरण श्रृंखला है :) –

उत्तर

-1

यह लाल-हेरिंग का थोड़ा सा था। स्पष्ट रूप से एक मौजूदा सिस्टम के लिए एक उपकरण श्रृंखला को पार करने के लिए एक जीएलबीबीसी के साथ जीएलबीबीसी को पुन: संकलित करने की आवश्यकता नहीं है। मैं ईमानदारी से नहीं जानता कि मैंने इस तथ्य को कैसे नजरअंदाज किया।

तो भले ही मुझे अभी भी पता नहीं है कि जीसीसी और जीआईएलबीसी संकलित कैसे करें, क्योंकि मुझे केवल जीसीसी की आवश्यकता है, मैं इसे बंद के रूप में चिह्नित करने जा रहा हूं।

यदि मैं कर सकता हूं, तो मैं इस पोस्ट पर वापस आऊंगा और आखिरकार जो किया वह मैंने चिह्नित किया।

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

चेकआउट this

1

तुम सच में अपने आप को पूरे toolchain का निर्माण करना चाहते हैं: कृपया
http://frank.harvard.edu/~coldwell/toolchain/
http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/build-arm-linux-3.4.4
मन में लें, हालांकि, आप toolchain compatibilty मैट्रिक्स के लिए खोज करना चाहिए या आप अजीब संकलन त्रुटियों में पड़ सकते हैं के रूप में।

आप अभी भी crosstool-एनजी के लिए विकल्प है, तो यह है कि मैं क्या कर रहा हूँ पिछले कुछ दिनों के लिए पर काम कर रहा था है:
http://blog.stranadurakov.com/2009/08/04/how-to-arm-linux/
यहाँ आप मेरी crosstool एनजी विन्यास फाइल है, जो मेरे लिए काम किया था मिलेगा ।

2

यहां HelenOS आर्म -32 टूलचैन इंस्टॉलेशन स्क्रिप्ट है, यह आपको बहुत कम झुकाव के साथ करना चाहिए। मैं अब उबंटू पर इसका उपयोग कर रहा हूं (मैं हेलेनॉस डेवलपर्स में से एक हूं)। यह मार्टिन डेकी द्वारा लिखा गया था:

#!/bin/bash 

# Cross-Compiler Toolchain for ${PLATFORM} 
# by Martin Decky <[email protected]> 
# 
# GPL'ed, copyleft 
# 


check_error() { 
    if [ "$1" -ne "0" ]; then 
     echo 
     echo "Script failed: $2" 
     exit 
    fi 
} 

if [ -z "${CROSS_PREFIX}" ] ; then 
    CROSS_PREFIX="/usr/local" 
fi 

BINUTILS_VERSION="2.19.1" 
GCC_VERSION="4.3.3" 

BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" 
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" 
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" 
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" 

BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" 
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" 

PLATFORM="arm" 
WORKDIR=`pwd` 
TARGET="${PLATFORM}-linux-gnu" 
PREFIX="${CROSS_PREFIX}/${PLATFORM}" 
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" 
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" 
OBJDIR="${WORKDIR}/gcc-obj" 

echo ">>> Downloading tarballs" 

if [ ! -f "${BINUTILS}" ]; then 
    wget -c "${BINUTILS_SOURCE}${BINUTILS}" 
    check_error $? "Error downloading binutils." 
fi 
if [ ! -f "${GCC_CORE}" ]; then 
    wget -c "${GCC_SOURCE}${GCC_CORE}" 
    check_error $? "Error downloading GCC Core." 
fi 
if [ ! -f "${GCC_OBJC}" ]; then 
    wget -c "${GCC_SOURCE}${GCC_OBJC}" 
    check_error $? "Error downloading GCC Objective C." 
fi 
if [ ! -f "${GCC_CPP}" ]; then 
    wget -c "${GCC_SOURCE}${GCC_CPP}" 
    check_error $? "Error downloading GCC C++." 
fi 

echo ">>> Creating destionation directory" 
if [ ! -d "${PREFIX}" ]; then 
    mkdir -p "${PREFIX}" 
    test -d "${PREFIX}" 
    check_error $? "Unable to create ${PREFIX}." 
fi 

echo ">>> Creating GCC work directory" 
if [ ! -d "${OBJDIR}" ]; then 
    mkdir -p "${OBJDIR}" 
    test -d "${OBJDIR}" 
    check_error $? "Unable to create ${OBJDIR}." 
fi 

echo ">>> Unpacking tarballs" 
tar -xvzf "${BINUTILS}" 
check_error $? "Error unpacking binutils." 
tar -xvjf "${GCC_CORE}" 
check_error $? "Error unpacking GCC Core." 
tar -xvjf "${GCC_OBJC}" 
check_error $? "Error unpacking GCC Objective C." 
tar -xvjf "${GCC_CPP}" 
check_error $? "Error unpacking GCC C++." 

echo ">>> Compiling and installing binutils" 
cd "${BINUTILSDIR}" 
check_error $? "Change directory failed." 
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" 
check_error $? "Error configuring binutils." 
make all install 
check_error $? "Error compiling/installing binutils." 

echo ">>> Compiling and installing GCC" 
cd "${OBJDIR}" 
check_error $? "Change directory failed." 
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared 
check_error $? "Error configuring GCC." 
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc 
check_error $? "Error compiling/installing GCC." 

echo 
echo ">>> Cross-compiler for ${TARGET} installed." 

किसी भी लाइन रैपिंग के लिए खेद है, इसे ठीक करना आसान होना चाहिए। यदि आप इसे पाने के लिए पेस्टबिन या http लिंक चाहते हैं, तो बस एक टिप्पणी छोड़ दें।

+0

धन्यवाद। मैं अब कोशिश कर रहा हूँ; इससे पहले कि मैं आशा करता था कि मैं आपकी स्क्रिप्ट से कॉन्फ़िगर लाइन को पिछली बार कोशिश कर रहा था ... कोई भाग्य (अभी तक)। – Jamie

+0

क्या आपने इसका परीक्षण किया? बिन utils संकलित नहीं करता है। BINUTILS के संकलन में, मैंने स्रोत फ़ाइलों में से किसी एक को बदलने के लिए कुछ "sed" स्क्रिप्टिंग जोड़ा। देखें http://www.mail-archive.com/[email protected]/msg06475.html – Jamie

+1

BinUtils को संकलित करने में त्रुटि के अलावा, यह काम करता है यदि आप नंगे धातु के लिए एक कंपाइलर चाहते हैं। मुझे एक लिनक्स/जीएलबीबी उपकरण स्टैक चाहिए। हालांकि धन्यवाद। – Jamie

1

मैंने हाल ही में crosstool-ng का उपयोग करके एआरएम के लिए एक जीएनयू टूलचेन बनाया है। यह पता लगाने की जो toolchain घटकों के संस्करणों को एक साथ अच्छा अदा कर सकता है परीक्षण और त्रुटि का एक सा लिया, लेकिन मैं अंत में यह निम्न संस्करणों के साथ काम कर ली:

  • binutils 2.19.1
  • जीसीसी 4.3.2
  • जीएमपी 4.2.2
  • लिनक्स कर्नेल 2.6.2 9।1
  • mpfr 2.3.1
  • uclibc 0.9.30.1

यदि आप के लिए इन काम को देखें।

इसके अलावा, OpenWrt इसकी निर्माण प्रक्रिया के हिस्से के रूप में एक क्रॉस-कंपाइलिंग टूलचेन बनाता है। आप इसे आज़मा सकते हैं, लक्ष्य के रूप में एआरएम-आधारित बोर्डों में से एक का चयन करना, भले ही आप वायरलेस राउटर बनाने में रूचि न करें।

1

लिनक्स को क्रॉस-कंपाइलिंग के लिए टूलचेन्स और लाइब्रेरी बनाने के लिए buildroot का उपयोग करके मुझे शुभकामनाएं मिली हैं। Buildroot glibc की बजाय हल्के uclibc सी लाइब्रेरी का उपयोग करता है, इसलिए यह आपके उद्देश्यों के लिए काम नहीं कर सकता है। (और टूलचैन प्राप्त करना इस तरह से रोमांचक और खुद को संकलित नहीं कर सकता है।)

7

आपका स्वागत है, आप अकेले नहीं हैं।

कहानी

क्यों एआरएम पार संकलन इस तरह के एक बुरा सपना है मैं नहीं जानता। यह मेरी राय नहीं है, देखते हैं, अन्य लोगों के विचार हैं ...

एम्बेडेड सिस्टम में इस्तेमाल के लिए एक जीसीसी/glibc पार toolchain बिल्डिंग विकास एक डरावना संभावना हुआ करता था होगा, दिन अगर लोहे की आवश्यकता होती है, प्रयास के सप्ताह नहीं, यूनिक्स के बहुत सारे और जीएनयू लोअर, और कभी-कभी की इच्छा डोडी शॉर्टकट लेते हैं। (http://www.kegel.com/crosstool/)

मेरे एआरएम कंप्यूटर (GuruPlug) डेबियन पर चल रहा है, तो मैं सिर्फ एक मानक जी ++ संकलक की जरूरत है, किसी भी तोड़ मरोड़ के बिना।

मैं अपनी नोटबुक पर 32-बिट उबंटू का उपयोग कर रहा हूं। एवीआर क्रॉस-कंपाइलर के लिए डीबी पैकेज हैं, या यहां तक ​​कि Z80 के लिए भी, लेकिन एआरएम के लिए कोई नहीं - क्यों? ठीक है, हमें एक संकलन करना है। चलिए चलते हैं। टूलचेन की संकलन प्रक्रिया मेरे लिए थोड़ा उलझन में है। 14k लाइनें लंबे मेकफ़ाइल, धन्यवाद।

कुछ दिनों के बाद (और रातें) मैं असफल रहा हूं।

समाधान

अंत में, मैं एक बाहर के बॉक्स soluion पाया है। मैंने अभी इस सामग्री के लाइट संस्करण को डाउनलोड किया है: http://www.codesourcery.com/sgpp/lite_edition.html और अब मैं खुश हूं। इसमें एक बदसूरत इंस्टॉलर है, लेकिन यह काम करता है।यह कहता है: बांह-कोई-लिनक्स-gnueabi-g ++ (सोर्सरी जी ++ लाइट 2010q1-202) 4.4.1, जो एक अद्यतित जी ++ संस्करण है।

(मेरे दोस्त एक मैक है, और वह भी एक सप्ताह के लिए इसके साथ लड़ने के बाद toolchain संकलन नाकाम रही है। अब वह एक वीएम चल Ubuntu पर इस संकलक उपयोग कर रहा है।)

+0

मेरी विशेष चुनौती यह है कि मुझे एक टूलचेन लिंक करना है जो लक्ष्य पर मौजूदा पुस्तकालयों का उपयोग करता है, और कर्नेल का एक नवीनतम संस्करण संकलित करेगा। अंततः मुझे यह काम करने के लिए मिला, दस्तावेजी दृष्टिकोण छोड़ने के कुछ हफ्तों बाद मुझे पता चला कि मैंने क्या किया। अब मैं उन बाइनरी को टैरबॉल के चारों ओर ले जाता हूं, यह सुनिश्चित कर रहा हूं कि जब तक मेरे मेजबान पर 32 बिट लाइब्रेरी इंस्टॉल हों। – Jamie

+0

वैसे, कोड कर्मचारियों पर बिक्री कर्मचारी, या कम से कम कार्लोस, मेरी आवश्यकताओं के बारे में मेरी समझ में बेहद सहायक था। उन जरूरतों के कारण, वे मुझे 'बॉक्स से बाहर' की मदद नहीं कर सके; फिर भी मैं सिर्फ एक संभावित ग्राहक के लिए अपनी सेवा से प्रभावित था। – Jamie

3

आप वास्तव में डाल दिया जाना चाहिए था और अधिक क्रॉसस्टूल-एनजी का उपयोग करने के साथ प्रयास, क्योंकि क्रॉसस्टूल मेलिंग सूची बहुत प्रतिक्रियाशील है। चूंकि पूरी प्रक्रिया को समझना एक बड़ा काम है, समझने के लिए कि आप जिस उपकरण का पुन: उपयोग कर सकते हैं उसका उपयोग कैसे करें IMHO अधिक दिलचस्प है।

+0

सहमत हुए, और मैं इस तरह से आगे बढ़ रहा हूं। लेकिन मैं अब तीन साल से सीओटीएस आर्म बोर्ड का उपयोग कर रहा हूं, और प्रोसेसर, रैम इत्यादि को फैब करने के लिए एक आकर्षक व्यवसायिक मामला है। क्रॉसस्टूल-एनजी ... जो इसे वितरित करता है उसके लिए आश्चर्यजनक है, लेकिन, यह 'sys-root' में काफी बड़े पदचिह्न का उत्पादन कर रहा है। यह अभ्यास एक शौक में बदल रहा है, एक जहां मैं कहना चाहूंगा "हाँ, मैं ऐसा कर सकता हूं, लेकिन परेशान क्यों है"। – Jamie

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