对仅 C 代码的“__aeabi_unwind_cpp_pr1”的未定义引用
undefined reference to `__aeabi_unwind_cpp_pr1' for C-only code
我正在为 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
中,我放了这个 linker flags:
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命令是
$(LINK.cc) $(OBJS) $(LD_LINK) src/lib_dummies.o -o $(BINARY).elf
我终于有了一个尽可能简单的自定义 linker 脚本:
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 来源),但它没有帮助。
我已经阅读了很多网页,但 none 向我解释了为什么 libgcc
试图 link 我的 C++
功能 C
-唯一的项目。
好吧,$(LINK.cc)
被评估为 arm-poky-linux-gnueabi-g++
,但我仍然觉得尝试 link 一个 C++
函数到 libgcc
毫无意义。如果我 linking libstdc++
就有意义了。此外,$(LD) 由于其他原因而失败(找不到 -lgcc
)。
我找不到任何优化标志可以帮助我解决这个问题。
你看,我的代码不添加任何不需要的东西是非常重要的。
一切开始只是因为我需要使用整数除法(未解决__aeabi_idiv
...)
为简单起见,我省略了优化标志,但如果需要,请告诉我,我会添加它们。
任何帮助将不胜感激。
谢谢。
嗯,
经过漫长的战斗,我以一个相对简单的解决方案结束。
在我的 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 语言做到这一点,我会非常高兴。
奖金:
我的最终二进制文件 比我之前得到的要小,这正是我需要的!
我正在为 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
中,我放了这个 linker flags:
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命令是
$(LINK.cc) $(OBJS) $(LD_LINK) src/lib_dummies.o -o $(BINARY).elf
我终于有了一个尽可能简单的自定义 linker 脚本:
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 来源),但它没有帮助。
我已经阅读了很多网页,但 none 向我解释了为什么 libgcc
试图 link 我的 C++
功能 C
-唯一的项目。
好吧,$(LINK.cc)
被评估为 arm-poky-linux-gnueabi-g++
,但我仍然觉得尝试 link 一个 C++
函数到 libgcc
毫无意义。如果我 linking libstdc++
就有意义了。此外,$(LD) 由于其他原因而失败(找不到 -lgcc
)。
我找不到任何优化标志可以帮助我解决这个问题。
你看,我的代码不添加任何不需要的东西是非常重要的。
一切开始只是因为我需要使用整数除法(未解决__aeabi_idiv
...)
为简单起见,我省略了优化标志,但如果需要,请告诉我,我会添加它们。
任何帮助将不胜感激。 谢谢。
嗯,
经过漫长的战斗,我以一个相对简单的解决方案结束。
在我的 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 语言做到这一点,我会非常高兴。
奖金:
我的最终二进制文件 比我之前得到的要小,这正是我需要的!