5

crossdev での ARM + GCC + UCLIBC リンクの問題を解決できる人はいますか?

Gentoo フォーラムにも投稿されています: http://forums.gentoo.org/viewtopic-t-925012.html

最近、古い GCC と OABI を使用して開発された実行可能ファイルを含むプロジェクトに割り当てられました。参考までに、システム上で正常に動作する実行可能ファイルの readelf からのヘッダー出力を次に示します。

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 と最新の gcc/binutils/linux-headers/etc を使用してクロスコンパイラを作成しました。そしてEABIと。

$ crossdev arm-softfloat-linux-uclibceabi

私は非常に喜んで、そのクロス コンパイラを使用してローカル フォルダーに実行可能ファイルを追加し始めましたが、後でハードウェアで実行可能ファイルを試してみたところ、最終的にセグメンテーション エラーが発生したことがわかりました。私は、かなりのグーグル検索を介してのみ、uclibc 用の古いレガシー ABI である OABI が本当に必要であることに気付きました。私の以前のクロスコンパイラは 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

マシンは同じですが、セグメンテーション違反により、ターゲットでバイナリを実行する方法が提供されません。

さらにグーグルで調べたところ、レガシーシステム用の 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

この時点で、私は不安になり、-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

質問: これにより、EABI が正しくなく、OABI が必要であると考えるようになりました。そうですか?

私はそれが事実だと信じていたので、crossdev を通じて uclibc を調べ始めました。

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

なんらかのオブジェクト バイナリにコンパイルされるファイルが正しい elf ヘッダーを持っていることを報告できることをうれしく思います。だから私はこれが私が欲しいものだと思います。

しかし、これは 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.arch は __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) gcc のソフト フロートがリンカによって適切にインクルードされていません。現時点では、その理由をはっきりとは言えません。

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

そこで、GCC にソフト フロート用のビルドを強制し、後で 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-float と -mfloat-abi=soft が使用されているかどうかを確認しました。

$ 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-float=soft がconfig.log内に設定されていることに注意してください。そのため、フロートが生成されているはずだと思います。
そして、gcc のコンパイル オプションの -D__GCC_FLOAT_NOT_NEEDED に注意してください。

GCC で回帰を実行して、ブレークが発生した場所を確認しました。

  1. gcc 4.x は ulibc では機能しません。-- 4.4.4-r2 以降、ulibc は gcc とのリンクに失敗します -- 4.4.4 より前では、gcc は表示されません
  2. gcc-3.4.6-r2 は、USE=-nptl が使用されている場合に機能します

参考までに、以下を実行しました: binutils: 2.22-r1 Linux Header: 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

4

1 に答える 1

5

最終的に gcc-4.7.0 に移行しました。最終的なビルドは次のとおりです。

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

私の作業中の crossdev arm-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"'

上記のオプションのすべてが必要なわけではありませんが、注記として、gcc の次のメジャー バージョンでは、ulibc の OABI を最新の状態に維持する意思のある開発者がいない限り、廃止されます。少なくとも 2 年間は 1 件も発生していません。

また、gcc で nptl を有効にしていません。nptl を有効にせずに crossdev ビルド ステージ 3 を実行し、nptl を使用して最終的な gcc を実行することは可能だと思いますが、これが実際に nptl を挿入することを証明するためにバイナリでテストを行っていません。

残念ながら、gcc と uclibc はそのままではうまく動作しません。また、見つけたエラーを修正するためのパッチが必要であることに気付きました。

これを簡単にするために、ebuild でまったく新しいオーバーレイを作成する必要がないように、パッチ フォルダーも作成することになりました。これにより、emerge の実​​行中にその場でパッチを追加できます。ほとんどの場合、これはほとんどのパッケージで機能します。私はまだPythonを使ってスムーズにコンパイルできるようにしています。

パッチ フォルダーの作成:

$ mkdir /etc/portage/patches

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

また、bashrc.autopatch を作成する必要があります。

File:  /etc/portage/bashrc.autopatch
#!/usr/bin/env sh
# <solar@gentoo> 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

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.

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 *);
于 2012-06-03T03:18:53.770 に答える