对于纯C代码,未定义引用`__aeabi_unwind_cpp_pr1'

时间:2017-08-08 00:59:23

标签: c linker linker-errors

我正在为ARM926构建一个裸机代码,我需要生成的输出尽可能紧。

尽管如此,我仍然收到这个错误:

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

为简单起见,我省略了优化标记,但如果需要,请告诉我,我会添加它们。

任何帮助将不胜感激。 感谢。

1 个答案:

答案 0 :(得分:0)

那么,

经过长时间的战斗后,我以一个相对简单的解决方案结束了。 在我的Makefile中,我将convert -delay 10 -loop 0 anim_*.gif animation.gif 行更改为:

LD_LINK

(已移除LD_LINK = -static -nostartfiles -nostdlib -lgcc

这导致我-Wl,--start-group,-lgcc,-lc,--end-group。 然后我将这几行添加到汇编源文件中:

undefined reference to raise

注意:

我尝试在C中创建一个 .global raise raise: b raise 函数,但是由于名称错误,尽管我尝试过任何技巧,但链接器却找不到它。

如果有人能告诉我如何在普通的C中做到这一点,我真的很开心。

<强>加成:

我的最终二进制文件方式小于我之前获得的内容,这正是我所需要的!