2012-05-28 16 views
5

Qualcuno può aiutarmi con il mio problema di collegamento ARM + GCC + UCLIBC con crossdev?ARM gentoo crossdev con uclibc: serve OABI piuttosto che EABI

Pubblicato anche al Forum Gentoo qui: http://forums.gentoo.org/viewtopic-t-925012.html

Recentemente, mi è stato assegnato a un progetto che ha sviluppato eseguibili utilizzando un vecchio GCC con OABI. Come punto di riferimento, ecco un'uscita colpo di testa da readelf di un file eseguibile che viene eseguito bene sul sistema:

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 

ho creaed un cross-compilatore tramite crossdev e l'ultima gcc/binutils/linux-headers/etc . e con EABI.

$ crossdev arm-softfloat-linux-uclibceabi 

ho tranquillamente cominciato a popolare la mia cartella locale con eseguibili che utilizzano tale cross compiler solo di riprovare più tardi l'eseguibile sul mio hardware e scoprire che ho finito con un segmentation fault. Ho capito, solo con un po 'di googling, che avevo davvero bisogno di avere il vecchio, legacy ABI per uclibc: OABI. Il mio precedente cross compiler era da circa 2005.

Come un altro punto di riferimento, i miei eseguibili con EABI producevano intestazioni da readelf che sembrano un po 'come questo:

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 

mentre la macchina è lo stesso, il l'errore di segmentazione non fornisce un modo per eseguire il binario sul target.

Dopo aver cercato su google, ho scoperto che potrebbe esserci un modo per produrre codice con il compilatore eabi per il sistema legacy. Sono stato molto felice quando mi sono imbattuto questo comando:

$ 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 

E ho finito con:

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 

A questo punto, mi è stato sempre antsy e ho deciso di provare a creare un file eseguibile con il - Mabi = APC-gnu,

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

e ottengo un errore di linker:

/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 

DOMANDA: Questo mi porta a credere che il mio EABI sia errato e ho bisogno di OABI. È giusto?

ho creduto che fosse il caso, così ho cominciato a guardare in uclibc tramite crossdev:

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

Sono lieto di comunicare che i file che si ottiene compilati in una sorta di oggetto binario hanno il diritto intestazione elfo. Quindi penso che questo sia quello che voglio.

Ma questo muore durante la compilazione per uclibc come segue:

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 

Se ho rotto l'errore in modo corretto, credo che

1) Il Makefile braccio.arco non è correttamente costruendo __aeabi_unwind_cpp_pr0 perché il file è costruito solo quando EABI è impostato:

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

Credo che la correzione di questo errore è:

--- 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) Il soft-galleggiante nel GCC non è correttamente incluso dal linker. Non posso davvero dire perché a questo punto.

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

così ho cercato di forzare GCC di costruire per un soft-float e ottenere quello legato tardi entro build di 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 

E poi ho controllato per vedere se -msoft-float e -mfloat -abi = soft sono stati utilizzati all'interno di qualsiasi registro per la compilazione.

$ 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 

Ma faccio notare che --with-float = dolce si trova all'interno del config.log, in modo che mi fa credere che il galleggiante avrebbe dovuto essere generato.
E noto il -D__GCC_FLOAT_NOT_NEEDED nelle opzioni di compilazione per gcc.

Ho eseguito una regressione su GCC per vedere dove si è verificata l'interruzione.

  1. gcc 4.x non funziona con uclibc. - a partire da 4.4.4-r2, uclibc ha un errore di collegamento con gcc - prima di 4.4.4, gcc non appare a
  2. gcc-3.4.6-r2 funziona a condizione che USE = -nptl è usato

Per riferimento mi sono imbattuto: binutils: 2.22-r1 Linux intestazione: 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

Ora ho un lavoro 4.7.0 Cross compilatore per uClibc. Mi ci vorrà un po 'di tempo per scrivere tutte le modifiche. –

risposta

5

Ho finito per passare a gcc-4.7.0. La build finale è:

  • binutils-2.22-r1
  • gcc-4.7.0
  • linux-headers-3.4
  • uclibc-0.9.33.2

Il mio braccio crossdev di lavoro -softfloat-linux-uclibc comando del compilatore assomiglia a questo:

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

Le opzioni abo Potrebbero non essere tutti necessari, ma come nota, la prossima versione principale di gcc sta andando a OABI di uclibc obsoleto a meno che non finiscano con uno sviluppatore che è disposto a tenerlo aggiornato. Non ce n'è stato uno in almeno due anni.

Inoltre, non ho abilitato nptl con gcc. Penso che sia possibile fare un crossdev build stage 3 senza nptl abilitato e quindi fare l'ultimo gcc con nptl, ma non ho fatto alcun test con i binari per dimostrare che questo effettivamente inserisce nptl.

Sfortunatamente, gcc e uclibc non suonano bene insieme appena fuori dalla scatola.Ho anche capito che avevo bisogno di alcune patch per correggere gli errori che ho trovato.

Per semplificare questo compito, ho anche creato una cartella delle patch, quindi non ho dovuto creare una sovrapposizione completamente nuova con gli ebuild. Durante l'esecuzione di emerge, questo mi consente di aggiungere patch al volo. Per la maggior parte, funzionerà con la maggior parte dei pacchetti. Sto ancora lavorando con Python per renderlo una compilazione fluida.

Creare la cartella patch:

$ mkdir /etc/portage/patches 

Aggiornamento bashrc portage:

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 

anche bisogno di creare 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 

Creazione di una patch per gcc:

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

Creazione di una patch per 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

puoi per favore gettare qualche luce su altri toolchain per questo caso, perché non ho gentoo installato – haohaolee

+0

Sfortunatamente, se non stai costruendo con gentoo, probabilmente non mi sarà di grande aiuto. Tuttavia, non dovrebbe importare quale toolchain tu abbia deciso di usare. Quello con gentoo lo rende molto comodo poiché è un wrapper relativamente trasparente. –

+0

Grazie. Penso di poter installare un gentoo in macchine virtuali per questa cosa speciale. A proposito, l'ultimo buildroot può costruire gcc 4.6.3 con il supporto OABI, e applicherebbe alcune patch simili alle tue, ma non funziona con 4.7.x – haohaolee

Problemi correlati