2012-05-28 25 views
5

के बजाय ओएबीआई की आवश्यकता है क्या कोई मेरी एआरएम + जीसीसी + यूसीएलबीसी क्रॉसडेव के साथ समस्या को जोड़ने में मदद कर सकता है? हाल ही में http://forums.gentoo.org/viewtopic-t-925012.htmlयूआरबीबीयू के साथ एआरएम gentoo crossdev: ईएबीआई

, मैं एक परियोजना OABI के साथ एक पुराने जीसीसी का उपयोग करके विकसित निष्पादनयोग्य है कि को सौंपा गया था:

इसके अलावा Gentoo मंच यहाँ पर पोस्ट किए गए।

ELF Header: 
    Magic: 7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
    Class:        ELF32 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       ARM 
    ABI Version:      0 
    Type:        EXEC (Executable file) 
    Machine:       ARM 
    Version:       0x1 
    Entry point address:    0x9464 
    Start of program headers:   52 (bytes into file) 
    Start of section headers:   540956 (bytes into file) 
    Flags:        0x202, has entry point, GNU EABI, software FP 
    Size of this header:    52 (bytes) 
    Size of program headers:   32 (bytes) 
    Number of program headers:   6 
    Size of section headers:   40 (bytes) 
    Number of section headers:   35 
    Section header string table index: 32 

मैं crossdev का उपयोग कर एक पार संकलक creaed और नवीनतम जीसीसी/binutils/लिनक्स हेडर/आदि: एक संदर्भ बिन्दु के रूप में, यहाँ एक निष्पादन की readelf से एक हैडर उत्पादन है कि सिस्टम पर ठीक चलाता है । और ईएबीआई के साथ।

$ crossdev arm-softfloat-linux-uclibceabi 

मैं काफी खुशी का उपयोग कर कि पार संकलक केवल बाद में मेरे हार्डवेयर पर निष्पादन कोशिश करते हैं और है कि मैं एक विभाजन गलती के साथ समाप्त हो गया पता लगाने के लिए निष्पादनयोग्य के साथ अपने स्थानीय फ़ोल्डर को भरने के लिए शुरू कर दिया। मुझे एहसास हुआ, केवल थोड़ी सी गुगलिंग के माध्यम से, मुझे वास्तव में पुरानी, ​​विरासत एबीआई के लिए यूक्लिब के लिए जरूरी था: ओएबीआई। मेरे पिछले पार संकलक था से लगभग 2005

संदर्भ की एक अन्य बिंदु के रूप में, मेरी निष्पादनयोग्य EABI readelf से हेडर उत्पादन कर रहे थे के साथ कि इस जैसे दिखते हैं:

ELF Header: 
    Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF32 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        EXEC (Executable file) 
    Machine:       ARM 
    Version:       0x1 
    Entry point address:    0x8130 
    Start of program headers:   52 (bytes into file) 
    Start of section headers:   21284 (bytes into file) 
    Flags:        0x5000002, has entry point, Version5 EABI 
    Size of this header:    52 (bytes) 
    Size of program headers:   32 (bytes) 
    Number of program headers:   7 
    Size of section headers:   40 (bytes) 
    Number of section headers:   21 
    Section header string table index: 18 

जबकि मशीन एक ही है, विभाजन गलती लक्ष्य पर बाइनरी निष्पादित करने का एक तरीका प्रदान नहीं करती है।

अधिक googling के बाद, मैंने पाया कि विरासत प्रणाली के लिए eabi संकलक के साथ कुछ कोड बनाने का एक तरीका हो सकता है। जब मैं इस आदेश को दौड़ा मैं काफी खुश था:

$ arm-softfloat-linux-uclibceabi-gcc -mabi=apcs-gnu -static -c -o /mnt/arm_uclibc/tmp/test /mnt/arm/tmp/test.c && readelf -h /mnt/arm_uclibc/tmp/test 

और मैं के साथ समाप्त हो गया:

ELF Header: 
    Magic: 7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
    Class:        ELF32 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       ARM 
    ABI Version:      0 
    Type:        REL (Relocatable file) 
    Machine:       ARM 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   0 (bytes into file) 
    Start of section headers:   248 (bytes into file) 
    Flags:        0x600, GNU EABI, software FP, VFP 
    Size of this header:    52 (bytes) 
    Size of program headers:   0 (bytes) 
    Number of program headers:   0 
    Size of section headers:   40 (bytes) 
    Number of section headers:   12 
    Section header string table index: 9 

इस बिंदु पर, मैं antsy हो रही थी और मैं कोशिश करते हैं और साथ एक निष्पादन योग्य बनाने का फैसला किया - mabi = APCs-gnu,

arm-softfloat-linux-uclibceabi-gcc -mabi=apcs-gnu -static -o /mnt/arm_uclibc/tmp/test /mnt/arm/tmp/test.c 

और मैं एक लिंकर त्रुटि मिलती है:

/usr/libexec/gcc/arm-softfloat-linux-uclibceabi/ld: error: Source object /tmp/ccDq2f6R.o has EABI version 0, but target /mnt/arm_uclibc/tmp/test has EABI version 5 
/usr/libexec/gcc/arm-softfloat-linux-uclibceabi/ld: failed to merge target specific data of file /tmp/ccDq2f6R.o 
collect2: ld returned 1 exit status 

प्रश्न: इससे मुझे विश्वास होता है कि मेरा ईएबीआई गलत है और मुझे ओबीआई की आवश्यकता है। क्या वह सही है?

मैं मानना ​​था कि यह मामला था, इसलिए मैं crossdev के माध्यम से uclibc में देखना शुरू कर दिया:

$ crossdev arm-softfloat-linux-uclibc -P -v 

मैं रिपोर्ट करने के लिए है कि फ़ाइलें जो करते वस्तु द्विआधारी के कुछ प्रकार में संकलित करने के अधिकार नहीं है खुश हूँ एल्फ हेडर। तो मुझे लगता है कि यह वही है जो मैं चाहता हूं।

लेकिन इस प्रकार इस uclibc के लिए संकलन के दौरान मर जाता है:

make[1]: `lib/ld-uClibc.so' is up to date. 
    LD libuClibc-0.9.33.2.so 
libc/libc_so.a(_fpmaxtostr.os): In function `_fpmaxtostr': 
_fpmaxtostr.c:(.text+0xbc): undefined reference to `__nedf2' 
_fpmaxtostr.c:(.text+0xe0): undefined reference to `__eqdf2' 
_fpmaxtostr.c:(.text+0xfc): undefined reference to `__divdf3' 
_fpmaxtostr.c:(.text+0x108): undefined reference to `__ltdf2' 
_fpmaxtostr.c:(.text+0x17c): undefined reference to `__muldf3' 
_fpmaxtostr.c:(.text+0x348): undefined reference to `__gedf2' 
_fpmaxtostr.c:(.text+0x40c): undefined reference to `__fixunsdfsi' 
libc/libc_so.a(__psfs_do_numeric.os): In function `__psfs_do_numeric': 
__psfs_do_numeric.c:(.text+0x534): undefined reference to `__truncdfsf2' 
libc/libc_so.a(close.oS):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0' 
collect2: ld returned 1 exit status 
make: *** [lib/libc.so] Error 1 

मैं त्रुटि नीचे ठीक से हड्डी टूट गई है, तो मुझे विश्वास है कि

1) हाथ Makefile।कट्टर ठीक से __aeabi_unwind_cpp_pr0 निर्माण नहीं है, क्योंकि फ़ाइल केवल जब EABI सेट किया गया है बनाया गया है:

$ find . -name 'Makefile.arch' -exec grep -i -H -n 'pr1' "{}" \; 
./uclibc-0.9.33.2/work/uClibc-0.9.33.2/libc/sysdeps/linux/arm/Makefile.arch:45: $(ARCH_OUT)/aeabi_sighandlers.os $(ARCH_OUT)/aeabi_unwind_cpp_pr1.o 
$ find . -name 'aeabi_unwind_cpp_pr1.c*' 
./uclibc-0.9.33.2/work/uClibc-0.9.33.2/libc/sysdeps/linux/arm/aeabi_unwind_cpp_pr1.c 
$ cat ./uclibc-0.9.33.2/work/uClibc-0.9.33.2/libc/sysdeps/linux/arm/aeabi_unwind_cpp_pr1.c 
#include <stdlib.h> 

attribute_hidden void __aeabi_unwind_cpp_pr0 (void); 
attribute_hidden void __aeabi_unwind_cpp_pr0 (void) 
{ 
} 

attribute_hidden void __aeabi_unwind_cpp_pr1 (void); 
attribute_hidden void __aeabi_unwind_cpp_pr1 (void) 
{ 
} 

attribute_hidden void __aeabi_unwind_cpp_pr2 (void); 
attribute_hidden void __aeabi_unwind_cpp_pr2 (void) 
{ 
} 

मेरा मानना ​​है कि इस त्रुटि के लिए ठीक है:

--- Makefile.arch.old 2012-05-28 00:43:52.918708833 -0500 
+++ Makefile.arch.new 2012-05-28 00:44:30.658708443 -0500 
@@ -42,5 +42,6 @@ 
libc-static-y += $(ARCH_OUT)/aeabi_lcsts.o $(ARCH_OUT)/aeabi_math.o \ 
     $(ARCH_OUT)/aeabi_sighandlers.o 
libc-nonshared-y += $(ARCH_OUT)/aeabi_lcsts.os $(ARCH_OUT)/aeabi_math.os \ 
-  $(ARCH_OUT)/aeabi_sighandlers.os $(ARCH_OUT)/aeabi_unwind_cpp_pr1.o 
+  $(ARCH_OUT)/aeabi_sighandlers.os 
endif 
+libc-nonshared-y += $(ARCH_OUT)/aeabi_unwind_cpp_pr1.o 

2) जीसीसी में नरम नाव नहीं है ठीक से लिंकर द्वारा शामिल किया जा रहा है। मैं वास्तव में क्यों नहीं बता सकता कि इस बिंदु पर क्यों।

$ find . -name '*.c' -exec grep -i -H -n nedf2 "{}" \; 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/mips/mips.c:11123:  set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2"); 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/eqdf2.c:51:strong_alias(__eqdf2, __nedf2); 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/testsuite/gcc.c-torture/execute/gofast.c:32:int nedf2 (double a, double b) { return a != b; } 
./gcc-4.5.3-r2/work/gcc-4.5.3/libgcc/config/rx/rx-abi-functions.c:41:int _COM_CMPNEd (double a, double b) { return __nedf2 (a, b) != 0; } 
$ ls ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/ 
README double.h  extendsftf2.c fixsfti.c  fixunssfdi.c floatdisf.c floattitf.c floatuntidf.c lesf2.c negtf2.c  single.h  trunctfdf2.c 
adddf3.c eqdf2.c  extendxftf2.c fixtfdi.c  fixunssfsi.c floatditf.c floatundidf.c floatuntisf.c letf2.c op-1.h  soft-fp.h  trunctfsf2.c 
addsf3.c eqsf2.c  fixdfdi.c  fixtfsi.c  fixunssfti.c floatsidf.c floatundisf.c floatuntitf.c muldf3.c op-2.h  subdf3.c  trunctfxf2.c 
addtf3.c eqtf2.c  fixdfsi.c  fixtfti.c  fixunstfdi.c floatsisf.c floatunditf.c gedf2.c  mulsf3.c op-4.h  subsf3.c  unorddf2.c 
divdf3.c extenddftf2.c fixdfti.c  fixunsdfdi.c fixunstfsi.c floatsitf.c floatunsidf.c gesf2.c  multf3.c op-8.h  subtf3.c  unordsf2.c 
divsf3.c extended.h  fixsfdi.c  fixunsdfsi.c fixunstfti.c floattidf.c floatunsisf.c getf2.c  negdf2.c op-common.h t-softfp  unordtf2.c 
divtf3.c extendsfdf2.c fixsfsi.c  fixunsdfti.c floatdidf.c floattisf.c floatunsitf.c ledf2.c  negsf2.c quad.h  truncdfsf2.c 
$ grep -i -H -n nedf2 ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/* 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/eqdf2.c:51:strong_alias(__eqdf2, __nedf2); 
$ grep -i -H -n eqdf2 ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/* 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/eqdf2.c:35:CMPtype __eqdf2(DFtype a, DFtype b) 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/eqdf2.c:51:strong_alias(__eqdf2, __nedf2); 
$ grep -i -H -n divdf3 ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/* 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/divdf3.c:35:DFtype __divdf3(DFtype a, DFtype b) 
$ grep -i -H -n ltdf2 ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/* 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/ledf2.c:51:strong_alias(__ledf2, __ltdf2); 
$ grep -i -H -n muldf3 ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/* 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/muldf3.c:35:DFtype __muldf3(DFtype a, DFtype b) 
$ grep -i -H -n gedf2 ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/* 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/gedf2.c:35:CMPtype __gedf2(DFtype a, DFtype b) 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/gedf2.c:51:strong_alias(__gedf2, __gtdf2); 
$ grep -i -H -n fixunsdfsi ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/* 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/fixunsdfsi.c:35:USItype __fixunsdfsi(DFtype a) 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/t-softfp:71:softfp_func_list := $(filter-out floatdidf floatdisf fixunsdfsi fixunssfsi \ 
$ grep -i -H -n truncdfsf2 ./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/* 
./gcc-4.5.3-r2/work/gcc-4.5.3/gcc/config/soft-fp/truncdfsf2.c:36:SFtype __truncdfsf2(DFtype a) 

तो मैं एक नरम फ्लोट के लिए निर्माण और है कि बाद uclibc के निर्माण के लिंक किए गए पाने के लिए जीसीसी के लिए मजबूर करने की कोशिश की:

$ UCLIBC_CPU=ARM926T ACCEPT_KEYWORDS="arm" CPU_CFLAGS="-marm -march=armv5te -mtune=arm926ej-s -mabi=apcs-gnu -mno-thumb" EXTRA_FLAGS="-msoft-float -mfloat-abi=soft" UCLIBC_EXTRA_CFLAGS="${CPU_CFLAGS} ${EXTRA_CFLAGS}" STAGE1_CFLAGS="${EXTRA_CFLAGS}" CFLAGS="${EXTRA_CFLAGS}" crossdev -A arm -t arm-softfloat-linux-uclibc -P -v 

और फिर मैं यह देखने के लिए जाँच की है, तो -msoft फ्लोट और -mfloat -बी = नरम संकलन के लिए किसी भी लॉग के भीतर इस्तेमाल किया गया था।

$ find . -name '*.log' -exec grep -i -H -n msoft-float "{}" \; 
<nothing> 
$ find . -name '*.log' 
./work/build/arm-softfloat-linux-uclibc/libgcc/config.log 
./work/build/libcpp/config.log 
./work/build/gcc/config.log 
./work/build/fixincludes/config.log 
./work/build/intl/config.log 
./work/build/build-x86_64-pc-linux-gnu/libiberty/config.log 
./work/build/build-x86_64-pc-linux-gnu/fixincludes/config.log 
./work/build/libdecnumber/config.log 
./work/build/libiberty/config.log 
./work/build/config.log 
./work/gcc-4.5.3/contrib/reghunt/examples/29478.log 
./work/gcc-4.5.3/contrib/reghunt/examples/29906a.log 
./work/gcc-4.5.3/contrib/reghunt/examples/29906b.log 
./work/gcc-4.5.3/contrib/reghunt/examples/28970.log 
./work/gcc-4.5.3/contrib/reghunt/examples/29106.log 
./work/gcc-4.5.3/contrib/reghunt/examples/30643.log 
./temp/elibtool.log 
./temp/epatch_user.log 
./temp/epatch.log 
./temp/eclass-debug.log 
./temp/build.log 

लेकिन मैं ध्यान दें कि --with-फ्लोट कर = मुलायम, config.log के भीतर निर्धारित ताकि मुझे विश्वास है कि नाव उत्पन्न किया जाना चाहिए था बनाता है।
और मैं gcc के संकलन विकल्पों में -D__GCC_FLOAT_NOT_NEEDED नोट करता हूं।

मैंने जीसीसी पर एक रिग्रेशन चलाया ताकि यह देखने के लिए कि ब्रेक कहाँ हुआ।

  1. जीसीसी 4.x uclibc के साथ काम नहीं करता है। - 4.4.4-आर 2 से शुरू होने पर, uclibc में gcc के साथ एक लिंकिंग विफलता है - 4.4.4 से पहले, जीसीसी
  2. gcc-3.4.6-r2 काम करता है, यह उपलब्ध कराया गया है कि USE = -nptl

प्रयोग किया जाता है संदर्भ के लिए मैं भाग गया: binutils: 2.22-R1 लिनक्स हेडर: 3.3, 3.4 uclibc: 0.9.33.2 जीसीसी: 3.2.3-r4, 3.3.6-R1, 3.4.6 -आर 2, 4.1.4-आर 1, 4.3.3-आर 2, 4.4.2, 4.4.4-आर 2, 4.4.5, 4.4.6-आर 1, 4.4.7, 4.5.3-आर 2, 4.6.0, 4.6 .1-आर 1, 4.6.2, 4.6.3

+0

मैं अब uclibc के लिए एक काम कर 4.7.0 पार संकलक है। मुझे सभी बदलावों को लिखने में थोड़ा समय लगेगा। –

उत्तर

5

मैं जीसीसी -4.7.0 पर आगे बढ़ गया। अंतिम निर्माण है:

  • binutils-2.22-R1
  • जीसीसी-4.7.0
  • लिनक्स हेडर-3,4
  • uclibc-0.9.33.2

मेरे काम की crossdev हाथ -softfloat-linux-uclibc संकलक आदेश इस तरह दिखता है:

#!/usr/bin/env sh 
CHOST=${CHOST-arm-softfloat-linux-uclibc} 
USE="-nptl" \ 
crossdev -t ${CHOST} \ 
-A arm -P "--digest" \ 
--g 4.7.0 --genv 'EXTRA_ECONF="--enable-obsolete --with-cpu=arm926ej-s \ 
        --without-system-libunwind --with-mode=arm \ 
        --with-abi=apcs-gnu --with-float-abi=soft"' \ 
--lenv 'UCLIBC_CPU="ARM926T" \ 
     UCLIBC_EXTRA_CFLAGS="-marm -mcpu=arm926ej-s"' 

विकल्पों abo हो सकता है कि सभी की आवश्यकता न हो, लेकिन एक नोट के रूप में, जीसीसी का अगला प्रमुख संस्करण अप्रचलित यूक्लिब के ओएबीआई पर जा रहा है जब तक कि वे एक डेवलपर के साथ समाप्त न हों जो इसे अद्यतन रखने के इच्छुक है। कम से कम दो वर्षों में कोई नहीं रहा है।

इसके अलावा, मेरे पास gcc के साथ nptl सक्षम नहीं है। मुझे लगता है कि एनएसटीएल सक्षम किए बिना क्रॉसडेव बिल्ड चरण 3 करना संभव है और फिर एनपीटीएल के साथ अंतिम जीसीसी करें, लेकिन मैंने यह साबित करने के लिए बाइनरी के साथ कोई परीक्षण नहीं किया है कि यह वास्तव में एनपीटीएल डालने वाला है।

दुर्भाग्यवश, जीसीसी और यूक्लिब बॉक्स के ठीक बाहर एक साथ अच्छा नहीं खेलते हैं।मुझे यह भी एहसास हुआ कि मुझे मिली त्रुटियों को ठीक करने के लिए मुझे कुछ पैच चाहिए।

अपने आप को यह आसान बनाने के लिए, मैंने पैच फ़ोल्डर बनाने का भी अंत किया, इसलिए मुझे ईबिल्ड के साथ पूरी तरह से नया ओवरले बनाने की आवश्यकता नहीं थी। उभरने के निष्पादन के दौरान, यह मुझे फ्लाई पर पैच जोड़ने देता है। अधिकांश भाग के लिए, यह अधिकांश पैकेजों के साथ काम करेगा। मैं अभी भी एक चिकनी संकलन करने के लिए पाइथन के साथ काम कर रहा हूं। Portage bashrc अपडेट कर रहा है

$ mkdir /etc/portage/patches 

:

पैच फ़ोल्डर बनाया जा

File: /etc/portage/bashrc 
#!/usr/bin/env sh 
[[ $(basename $(readlink -f $PORTAGE_CONFIGROOT/etc/make.profile)) == "embedded" ]] && . ${PORTDIR}/profiles/base/profile.bashrc 

post_src_install() { 
    [[ -d ${D} ]] || return 0 
    [[ ${E_MACHINE} == "" ]] && return 0 
    cmdline="" 
    for EM in $E_MACHINE; do 
     cmdline+=" -e ^${EM}[[:space:]]"; 
    done 
    output="$(cd ${D} && scanelf -RmyBF%a . | grep -v ${cmdline})" 
    [[ $output != "" ]] && { echo; echo "* Wrong EM_TYPE. Expected ${E_MACHINE}"; echo -e "${output}"; echo; exit 1; } 
} 

# We don't run this on the assumption that when you're 
# emerging binary packages, it's into a runtime ROOT 
# rather than build development ROOT. The former doesn't 
# want hacking while the latter does. 
if [[ $EBUILD_PHASE == "postinst" ]]; then 
    [[ $SYSROOT == $ROOT ]] && cross-fix-root ${CHOST} 
fi 

eecho() { 
    #[ "$NOCOLOR" = "false" ] && echo -ne '\e[1;34m>\e[1;36m>\e[1;35m>\e[0m ' || echo -n ">>> " 
    echo -ne '\e[1;34m>\e[1;36m>\e[1;35m>\e[0m ' || echo -n ">>> " 
    echo "$*" 
} 

run_autopatch() { 
    #echo ">>> --------------------------------------------------------------------" 
    #echo ">>>" 
    #echo ">>> Phase: $EBUILD_PHASE" 
    #echo ">>>" 
    #echo ">>> --------------------------------------------------------------------" 

    patchit="no" 
    if [[ $EBUILD_PHASE == prepare ]]; then 
    patchit="yes" 
    elif [[ $EBUILD_PHASE == configure ]]; then 
    patchit="yes" 
    elif [[ $EBUILD_PHASE == compile ]]; then 
    patchit="yes" 
    fi 

    if [[ $patchit != "no" ]]; then 
#   echo ">>> Patching" 
    [[ ! -d "$PATCH_OVERLAY" ]] && echo "PATCH_OVERLAY is not a directory: $PATCH_OVERLAY" && return 0; 
    [[ ! -r ${ROOT}etc/portage/bashrc.autopatch ]] && echo "Couldn't read autopatch script: ${ROOT}/etc/portage/bashrc.autopatch" && return 0; 
    source ${ROOT}etc/portage/bashrc.autopatch 
    fi 
} 

if [[ " ${FEATURES} " == *" autopatch "* ]] || [[ $AUTOPATCH="yes" ]]; then 
    run_autopatch 
fi 

इसके अलावा bashrc.autopatch बनाना होगा।

File: /etc/portage/bashrc.autopatch 
#!/usr/bin/env sh 
# <[email protected]> 2005 
# Distributed under the terms of the GNU General Public License v2 
# $Header: $ 
# updated by brian bruggeman 

autopatch() { 
local diff level p patches patched 

[[ ! -d "$PATCH_OVERLAY" ]] && return 0 

patches=$(ls -1 ${PATCH_OVERLAY}/${CATEGORY}/${PN}/${PN}-*.{patch,diff} 2>/dev/null) 
[[ $patches == "" ]] && echo "No patches found: ${PATCH_OVERLAY}/${CATEGORY}/${PN}/${PN}-*.patch" && return 0 

    if [[ -d $S ]] && [[ -e $S ]]; then 
    cd $S 
else 
    echo ">>> Couldn't cd to $S" 
fi 

    echo -e ' \e[0;36m*\e[0m '"Applying Autopatches from $PATCH_OVERLAY ..." 
for p in ${patches}; do 
    p=$(basename $p) 
    diff=${PATCH_OVERLAY}/${CATEGORY}/${PN}/${p} 
    if [[ -e $diff ]] && [ ! -e ${S}/.${p} ]; then 
     patched=0 
     for level in 0 1 2 3 4; do 
      if [[ $patched == 0 ]]; then 
       patch -g0 --dry -p${level} >/dev/null < $diff 
       if [ $? = 0 ]; then 
        echo -e ' \e[0;36m*\e[0m '" (-p${level}) ${p}" 
        patch -g0 -p${level} < $diff > /dev/null && patched=1 
        touch $S/.${p} 
       fi 
      fi 
     done 
     [[ $patched != 1 ]] && echo "!!! FAILED auto patching $p" 
    else 
     [[ ! -e $diff ]] && echo "!!! $diff does not exist, unable to auto patch" 
    fi 
done 
    echo -e ' \e[0;36m*\e[0m '"Done with patching auto patches ..." 
cd $OLDPWD 
} 

PATH=$PATH:/usr/sbin:/usr/bin:/bin:/sbin 
autopatch 

जीसीसी के लिए एक पैच बनाना:

$ cd /etc/portage/packages 
$ mkdir -p cross-arm-softfloat-linux-uclibc/gcc-4.7.0 
$ cd cross-arm-softfloat-linux-uclibc/gcc-4.7.0 
$ touch gcc-4.7.0-softfloat.patch 

File: /etc/portage/packages/cross-arm-softfloat-linux-uclibc/gcc-4.7.0/gcc-4.7.0-softfloat.patch 
Index: gcc/config/arm/linux-elf.h 
=================================================================== 
--- gcc/config/arm/linux-elf.h 2011-04-11 13:46:05.000000000 -0500 
+++ gcc/config/arm/linux-elf.h.new 2012-05-31 14:24:14.465545128 -0500 
@@ -48,7 +48,7 @@ 

#undef MULTILIB_DEFAULTS 
#define MULTILIB_DEFAULTS \ 
- { "marm", "mlittle-endian", "mfloat-abi=hard", "mno-thumb-interwork" } 
+ { "marm", "mlittle-endian", "mfloat-abi=soft", "mno-thumb-interwork" } 

/* Now we define the strings used to build the spec file. */ 
#undef LIB_SPEC 
@@ -57,7 +57,7 @@ 
    %{shared:-lc} \ 
    %{!shared:%{profile:-lc_p}%{!profile:-lc}}" 

-#define LIBGCC_SPEC "%{mfloat-abi=soft*:-lfloat} -lgcc" 
+#define LIBGCC_SPEC "-lgcc" 

#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2" 

Index: libgcc/config/arm/t-linux 
=================================================================== 
--- ./libgcc/config/arm/t-linux 2011-11-02 10:23:48.000000000 -0500 
+++ ./libgcc/config/arm/t-linux.new 2012-05-31 14:29:57.715541608 -0500 
@@ -1,6 +1,10 @@ 
LIB1ASMSRC = arm/lib1funcs.S 
LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx _clzsi2 _clzdi2 \ 
- _arm_addsubdf3 _arm_addsubsf3 
+ _arm_addsubdf3 _arm_addsubsf3 \ 
+ _arm_negdf2 _arm_muldivdf3 _arm_cmpdf2 _arm_unorddf2 \ 
+ _arm_fixdfsi _arm_fixunsdfsi _arm_truncdfsf2 \ 
+ _arm_negsf2 _arm_muldivsf3 _arm_cmpsf2 _arm_unordsf2 \ 
+ _arm_fixsfsi _arm_fixunssfsi 

# Just for these, we omit the frame pointer since it makes such a big 
# difference. 

uclibc के लिए एक पैच बनाना:

$ cd /etc/portage/packages 
$ mkdir -p cross-arm-softfloat-linux-uclibc/uclibc 
$ cd cross-arm-softfloat-linux-uclibc/uclibc 
$ touch uclibc-0.9.33.2-unwind-fixes.patch 

File: /etc/portage/packages/cross-arm-softfloat-linux-uclibc/uclibc/uclibc-0.9.33.2-unwind-fixes.patch 
Index: libc/sysdeps/linux/arm/Makefile.arch 
=================================================================== 
--- ./libc/sysdeps/linux/arm/Makefile.arch 2012-05-15 02:20:09.000000000 -0500 
+++ ./libc/sysdeps/linux/arm/Makefile.arch.new 2012-05-31 00:43:11.176050458 -0500 
@@ -42,5 +42,6 @@ 
libc-static-y += $(ARCH_OUT)/aeabi_lcsts.o $(ARCH_OUT)/aeabi_math.o \ 
    $(ARCH_OUT)/aeabi_sighandlers.o 
libc-nonshared-y += $(ARCH_OUT)/aeabi_lcsts.os $(ARCH_OUT)/aeabi_math.os \ 
- $(ARCH_OUT)/aeabi_sighandlers.os $(ARCH_OUT)/aeabi_unwind_cpp_pr1.o 
+ $(ARCH_OUT)/aeabi_sighandlers.os 
endif 
+libc-nonshared-y += $(ARCH_OUT)/aeabi_unwind_cpp_pr1.o 
Index: libc/sysdeps/linux/arm/unwind.h 
=================================================================== 
--- ./libc/sysdeps/linux/arm/unwind.h 2012-05-31 00:57:39.356041552 -0500 
+++ ./libc/sysdeps/linux/arm/unwind.h.new 2012-05-31 01:04:55.436037080 -0500 
@@ -34,6 +34,8 @@ 

#define __ARM_EABI_UNWINDER__ 1 

+#include <stdlib.h> 
+ 
#ifdef __cplusplus 
extern "C" { 
#endif 
@@ -211,7 +213,7 @@ 
    _Unwind_Control_Block *, struct _Unwind_Context *, void *); 
    _Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Control_Block *, 
         _Unwind_Stop_Fn, void *); 
- _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *); 
+ extern _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *); 
    void _Unwind_Complete(_Unwind_Control_Block *ucbp); 
    void _Unwind_DeleteException (_Unwind_Exception *); 
+0

क्या आप इस मामले के लिए अन्य टूलचेन बिल्डिंग टूल पर कुछ रोशनी डाल सकते हैं, क्योंकि मुझे gentoo इंस्टॉल नहीं किया गया है – haohaolee

+0

दुर्भाग्यवश, यदि आप gentoo के साथ नहीं बना रहे हैं, तो शायद मुझे बहुत मदद नहीं मिल रही है। हालांकि, इससे कोई फ़र्क नहीं पड़ता कि आपने किस टूलचैन का उपयोग करने का निर्णय लिया है। Gentoo वाला एक यह बहुत सुविधाजनक बनाता है क्योंकि यह अपेक्षाकृत पारदर्शी रैपर है। –

+0

धन्यवाद। मुझे लगता है कि मैं इस विशेष चीज़ के लिए आभासी मशीनों में एक gentoo स्थापित कर सकते हैं। वैसे, नवीनतम बिल्ड्रूट ओएबीआई समर्थन के साथ जीसीसी 4.6.3 का निर्माण कर सकता है, और यह आपके जैसे कुछ पैच लागू करेगा, लेकिन यह मेरे जीसीसी 4.6.3 ओएबीआई बिल्ड, आई के साथ 4.7.x – haohaolee