के बजाय ओएबीआई की आवश्यकता है क्या कोई मेरी एआरएम + जीसीसी + यूसीएलबीसी क्रॉसडेव के साथ समस्या को जोड़ने में मदद कर सकता है? हाल ही में 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 नोट करता हूं।
मैंने जीसीसी पर एक रिग्रेशन चलाया ताकि यह देखने के लिए कि ब्रेक कहाँ हुआ।
- जीसीसी 4.x uclibc के साथ काम नहीं करता है। - 4.4.4-आर 2 से शुरू होने पर, uclibc में gcc के साथ एक लिंकिंग विफलता है - 4.4.4 से पहले, जीसीसी
- 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
मैं अब uclibc के लिए एक काम कर 4.7.0 पार संकलक है। मुझे सभी बदलावों को लिखने में थोड़ा समय लगेगा। –