2017-08-08 56 views
0

我正在構建ARM926的裸機代碼,我需要生成的輸出儘可能緊湊。對C代碼的`__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' 

在我Makefile我把這個連接器選項:

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源代碼),但它沒有幫助。

我已經閱讀了相當多的網頁,但沒有解釋爲什麼libgcc試圖將C++功能鏈接到我的C-僅限於項目。 好吧,$(LINK.cc)評估爲arm-poky-linux-gnueabi-g++,但我仍然沒有意識到試圖鏈接C++功能libgcc。如果我連接libstdc++這將是有意義的。此外,$(LD)由於其他原因而失敗(找不到-lgcc)。

沒有優化標誌我可以找到幫助我這個。

看,我的代碼不添加任何不必要的東西是非常重要的。 一切都只是開始,因爲我需要使用整數除法(未解決__aeabi_idiv ...)


我爲了簡化省略的優化參數,但如果需要的話,請告訴我,我會添加它們。

任何幫助將不勝感激。 謝謝。

回答

0

好,

經過很長時間的戰鬥,我有一個相對簡單的解決方案結束。 在我的Makefile中,我改變了LD_LINK行:

LD_LINK = -static -nostartfiles -nostdlib -lgcc 

(除去-Wl,--start-group,-lgcc,-lc,--end-group

這使我的undefined reference to raise。 然後我說這幾行彙編源文件:

.global raise 

raise: 
    b raise 

注:

我試圖用C創建一個raise功能,但由於名字改編,儘管我已經試過任何技巧,鏈接器無法找到它。

如果有人能告訴我如何在純C中做到這一點,我會非常開心。

獎勵:

我最終的二進制是方式比我漸漸以前小,這是我需要的!