2012-05-28 29 views
5

Kann mir jemand mit meinem ARM + GCC + UCLIBC-Verknüpfungsproblem mit crossdev helfen?ARM gentoo crossdev mit uclibc: brauche OABI anstatt EABI

auch auf Gentoo Foren hier gepostet: http://forums.gentoo.org/viewtopic-t-925012.html

Vor kurzem wurde ich zu einem Projekt zugeordnet, die ausführbaren Dateien entwickelt mit einem alten GCC mit OABI hat. Als Bezugspunkt, hier ist ein Kopf Ausgabe von readelf einer ausführbaren Datei, die gerade fein auf dem System läuft:

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 

creaed ich einen Cross-Compiler crossdev und die neuesten gcc/binutils/linux-Header mit/etc . und mit EABI.

$ crossdev arm-softfloat-linux-uclibceabi 

ich ganz begann glücklich erst später mit, dass Cross-Compiler meinen lokalen Ordner mit ausführbaren Dateien zu füllen, um die ausführbare Datei auf meiner Hardware versuchen und herausfinden, dass ich mit einem Segmentierungsfehler endete. Ich stellte fest, dass ich nur durch ziemlich viel Googeln wirklich das alte, alte ABI für uclibc brauchte: OABI. Meine bisherige Cross-Compiler wurde von circa 2005

Als weiterer Bezugspunkt, meine ausführbare Dateien mit EABI wurden Header aus readelf produzieren, die ein bisschen wie folgt aussehen:

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 

Während die Maschine die gleiche ist, die Segmentierungsfehler bietet keine Möglichkeit, die Binärdatei auf dem Ziel auszuführen.

Nach googlen mehr, fand ich, dass es eine Möglichkeit gibt, etwas Code mit dem eabi-Compiler für das Altsystem zu produzieren. Ich war ziemlich glücklich, wenn ich diesen Befehl lautete:

$ 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 

und ich landete mit:

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 

An diesem Punkt war ich immer kribbelig und ich beschlossen, zu versuchen, eine ausführbare Datei mit dem erstellen - Mabi = APCs-Gnu,

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

Und ich bekomme einen Linker-Fehler:

/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 

FRAGE: Das führt mich zu der Annahme, dass mein EABI falsch ist und ich OABI brauche. Ist das richtig?

Ich glaubte, dass es der Fall war, so fing ich an, in uclibc durch crossdev aussehen:

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

Ich bin glücklich, zu berichten, dass die Dateien, die in eine Art von Objekt binären das Recht haben, zusammengestellt Versteh Elf Kopfzeile. Also ich denke das ist was ich will.

Aber diese stirbt während der Kompilierung für uclibc wie folgt:

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 

Wenn ich nach unten richtig den Fehler gebrochen haben, glaube ich, dass

1) Der Arm Makefile.Bogen nicht richtig bauen __aeabi_unwind_cpp_pr0, da die Datei nur gebaut wird, wenn EABI gesetzt:

$ 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) 
{ 
} 

ich das Update für diesen Fehler glauben ist:

--- 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) Der Soft-Schwimmer in gcc ist nicht entweder vom Linker korrekt aufgenommen werden. Ich kann an dieser Stelle nicht wirklich sagen, warum.

$ 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) 

Also versuchte ich GCC zu zwingen, für einen Soft-Schwimmer zu bauen und dass später in uclibc Build verknüpft erhalten:

$ 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 

Und dann, wenn ich überprüft, um zu sehen -msoft-Schwimmer und -mfloat -abi = soft wurde in jedem Protokoll zum Kompilieren verwendet.

$ 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 

Aber ich beachten Sie, dass --with-float = weich innerhalb des config.log gesetzt, so dass macht mich glauben, dass der Schwimmer erzeugt werden sollte.
Und ich notiere die -D_GCC_FLOAT_NOT_NEEDED in den Übersetzungsoptionen für gcc.

Ich lief eine Regression auf GCC, um zu sehen, wo der Bruch aufgetreten ist.

  1. gcc 4.x funktioniert nicht mit uclibc. - beginnend mit 4.4.4-r2, hat uclibc einen Verbindungsfehler mit gcc - vor 4.4.4 erscheint gcc nicht zu
  2. gcc-3.4.6-r2 funktioniert, vorausgesetzt, dass USE = -nptl

Referenz verwendete ich lief: binutils: 2,22-r1 Linux Rubrik: 3.3, 3.4 uclibc: 0.9.33.2 gcc: 3.2.3-r4, 3.3.6-r1, 3.4.6 -r2, 4.1.4-r1, 4.3.3-r2, 4.4.2, 4.4.4-r2, 4.4.5, 4.4.6-r1, 4.4.7, 4.5.3-r2, 4.6.0, 4.6 .1-r1, 4.6.2, 4.6.3

+0

ich jetzt eine Arbeits 4.7.0 Cross-Compiler für uclibc haben. Ich werde ein bisschen Zeit brauchen, um alle Änderungen zu schreiben. –

Antwort

5

Ich wechselte schließlich zu gcc-4.7.0. Der letzte Build ist:

  • binutils-2,22-r1
  • gcc-4.7.0
  • linux-headers-3.4
  • uclibc-0.9.33.2

Mein Arbeits crossdev Arm Der Befehl -softfloat-linux-uclibc-Compiler sieht wie folgt aus:

#!/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"' 

Die Optionen abo Es könnte sein, dass nicht alle benötigt werden, aber als eine Anmerkung wird die nächste Hauptversion von gcc das OABI von uclibc veralten lassen, wenn sie nicht mit einem Entwickler enden, der bereit ist, ihn auf dem neuesten Stand zu halten. Seit mindestens zwei Jahren gibt es keinen mehr.

Ich habe auch nicht NPT mit gcc aktiviert. Ich denke, dass es möglich ist, einen crossdev-Build-Schritt 3 ohne nptl zu machen und dann den finalen gcc mit nptl zu machen, aber ich habe keine Tests mit den Binaries durchgeführt, um zu beweisen, dass dies tatsächlich nptl einfügt.

Leider spielen gcc und uclibc nicht direkt zusammen aus der Schachtel.Ich erkannte auch, dass ich einige Patches benötigte, um die gefundenen Fehler zu beheben.

Um mir dies zu erleichtern, habe ich auch einen Patch-Ordner erstellt, so dass ich kein komplett neues Overlay mit Ebuilds erstellen musste. Während der Ausführung von emerge konnte ich Patches im laufenden Betrieb hinzufügen. In den meisten Fällen wird dies mit den meisten Paketen funktionieren. Ich arbeite immer noch mit Python, um eine reibungslose Kompilierung zu machen.

Erstellen der Patches Ordner:

$ mkdir /etc/portage/patches 

aktualisiert portage bashrc:

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 

müssen auch bashrc.autopatch erstellen.

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 

einen Patch für gcc erstellen:

$ 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. 

einen Patch für uclibc Erstellen:

$ 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

können Sie bitte etwas Licht auf andere Toolchain Gebäude-Tool für diesen Fall, weil ich nicht gentoo installiert haben – haohaolee

+0

Leider, wenn Sie nicht mit Gentoo bauen, werde ich wahrscheinlich nicht viel Hilfe sein. Es sollte jedoch nicht darauf ankommen, welche Toolchain Sie verwenden möchten. Der mit gentoo macht dies sehr praktisch, da es eine relativ transparente Hülle ist. –

+0

Danke. Ich denke, ich kann ein Gentoo in virtuellen Maschinen für diese spezielle Sache installieren. By the way, das neueste Buildroot kann GCC 4.6.3 mit OABI-Unterstützung erstellen, und es würde einige Patches ähnlich wie Ihre, aber es funktioniert einfach nicht mit 4.7.x – haohaolee

Verwandte Themen