2017-08-08 4 views
0

私はARM926のためのベアメタルコードを構築しており、生成された出力を可能な限り厳密にする必要があります。私は、このリンカのフラグ置く私のMakefileC唯一のコードのための `__aeabi_unwind_cpp_pr1 'への未定義の参照

yocto/poky/build-idprint/tmp/work/idprint-poky-linux-gnueabi/idpr/1.0-r0/ 
recipe-sysroot/usr/lib/libc.a(raise.o): 
(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr1' 

:私のベストエフォートで

は、しかし、私はまだ、このエラーが表示さ

LD_OPT = -Wl,-gc-sections -Wl,-build-id=none -flto 
LD_LINK = -static -nostartfiles -nostdlib -Wl,--start-group,-lgcc,-lc,--end-group 
LDFLAGS = -T $(BINARY).ld -Xlinker -Map=$(BINARY).map $(LD_OPT) 

とリンクコマンドを

$(LINK.cc) $(OBJS) $(LD_LINK) src/lib_dummies.o -o $(BINARY).elf 
です

最後に私はできるだけシンプルなカスタムリンカースクリプトを持っています:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 
OUTPUT_ARCH(arm) 
ENTRY(fiq_main) 

SECTIONS 
{ 
    . = 0x0; 
    .text : { 
    KEEP(*(.textEntry)); 
    *(.text*) 
    *(.text .gnu.linkonce.t.*) 
    } 
    . = ALIGN(1024); 
    _bss_start = .; 
    .data : { *(.data) } 
    .bss : { *(.bss) } 
    _bss_end = .; 
} 

カスタムダミー__aeabi_unwind_cpp_pr1を(libgccソースからインスピレーションを得て)自分のコードに追加しましたが、それは役に立ちませんでした。

私はウェブの周りにかなりの数のページについて読んだことがあるが、私のCのみのプロジェクトにC++機能をリンクしようとしlibgccである理由どれも私に説明していません。 さて、$(LINK.cc)arm-poky-linux-gnueabi-g++と評価されますが、C++の機能をlibgccにリンクしようとしても意味がありません。私がlibstdc++をリンクしていれば意味があります。さらに、$(LD)は他の理由で失敗します(-lgccが見つかりません)。

私が見つけることができた最適化フラグがありません。

私のコードでは、未知のものを追加しないことが非常に重要です。私は整数の除算を使用する必要があるため すべてが


私は必要であれば、教えてください、私はそれらを追加しますしてください、簡単にするために最適化フラグを省略したが(未解決__aeabi_idivを...)のみを開始しました。

ご協力いただきますようお願い申し上げます。おかげさまで

答えて

0

まあ、非常に長い戦いの後

は、私は比較的簡単な解決策で終わりました。これはundefined reference to raiseに私を導いた

LD_LINK = -static -nostartfiles -nostdlib -lgcc 

-Wl,--start-group,-lgcc,-lc,--end-groupを削除)

:私のMakefileで は、私はにLD_LINKラインを変更しました。私は原因名前の符号化に、私が試したすべてのトリックにもかかわらず、Cでraise関数を作成しようとしたが、

.global raise 

raise: 
    b raise 

注: は、それから私は、アセンブリソースファイルにこの数行を追加しましたリンカーはそれを見つけることができませんでした。

誰かが私にプレーンな方法でそれをする方法を示すことができたら、本当にうれしいでしょう。

ボーナス:

私の最後のバイナリは、私が前になっていたものよりも方法小さくなり、そしてそれは私が必要なものだけです!

関連する問題