GDB 无法使用 std 将二进制文件加载到 C 和 C++ 混合程序的目标::

GDB cannot load binary to target with C and C++ mixing program using std::

提问人:KhoiN 提问时间:3/14/2023 更新时间:3/14/2023 访问量:81

问:

我正在尝试将 C++ 源代码移植到基于 C 的项目(C 中的主函数)中,用于基于 risc-v cpu 的目标。该程序可以毫无问题地编译,但在某些情况下我无法将二进制文件加载到目标。

在我的代码中,有 3 个类 Switch、Member 和 Adapter。类 Adapter 继承了 Member 类,其中使用了 std::vector

我尝试了 4 种情况,如下所示:

案例一:

在程序中,我创建了一个 Switch 类的对象。代码编译没有错误,但我无法将二进制文件加载到目标。我得到了与 GDB 相关的错误,如下面的 2 张照片所示:

在此处输入图像描述

在此处输入图像描述

此外,我还得到了与异常处理和 std:: 相关的符号:

<__cxa_allocate_exception>

<__cxa_throw>

<std::bad_alloc::~bad_alloc()>

<std::bad_exception::~bad_exception()>

...

案例二:

在本例中,我创建了一个类 Switch 的对象,同时覆盖了 newdelete 运算符。二进制文件可以加载到目标。

与案例 1 相比,没有任何异常处理符号,唯一与 std:: 相关的是 std::type_info

案例三:

这一次,在程序中,我创建了一个 Switch 类的对象和一个 Adapter 类的对象。new 和 delete 运算符始终被覆盖。我在案例 1 中遇到了相同的错误。

在符号列表中,我再次发现了很多异常处理和 std:: 符号。

案例4:

对于这种情况,我创建了一个 Switch 类的对象,并在代码中使用了 std::vector<>。我在案例 1 中遇到了相同的错误。

当然,符号列表中有很多异常处理和 std:: 符号。

获得的结果可以表明我的问题是由于 std:: 引起的,我已经在链接对象时尝试了 --fno-exceptions -nostdlib -std=gnu++0x,但仍然无法解决问题。

附言:我使用了riscv32-elf-(nds32le-elf-mculib-v5f)工具链和AndeSight中集成的GDB。

你们有没有遇到过和我一样的问题?

在编译和链接方面混合 C 和 C++ 时,您有什么建议吗?

任何休息将不胜感激。先谢谢你。

C++ C GDB 标准 RISCV

评论

0赞 alagner 3/14/2023
在嵌入式平台上使用 C++ 可能会很麻烦,尤其是在设置项目时。我不知道您的确切平台,但可以肯定的是,要使用 -fnoexceptions,必须用它重新编译整个 stdlib。你可以看看这个项目,看看如何在嵌入式上下文中使用C++(虽然在ARM上)。
0赞 KhoiN 3/14/2023
您的意思是在最终链接之前必须重新编译 stdlib?
0赞 Alan Birtles 3/14/2023
请展示一个最小的可重复示例,不要发布文本图像,直接发布文本
0赞 alagner 3/14/2023
@NguyênPhạmNgọcKhôi看到这个: stackoverflow.com/a/6049745/4885321 也许这可以通过使用自定义分配器来规避,我不知道马上。
1赞 Stephen M. Webb 3/14/2023
您缺少 C++ 语言运行时(与 C++ 标准库不完全相同)。您可以通过在独立(非托管)模式下重建 C++ 标准库并在整个堆栈中禁用 RTTI 和异常来避免需要它,但这意味着什么以及它将如何操作是完全没有指定的。除此之外,规则是,如果您使用任何 C++,则必须使用 C++ 链接器,因为语言运行时和启动是不同的。

答: 暂无答案