我正在学习编写裸机 ARM Cortex-A7 固件以在带有半主机的 QEMU 上运行。我知道 ARM GCC 有一个名为 newlib 的 libc 实现,它支持常用 libc 函数的半主机。所以我试图让 newlib 也能正常工作。
在解决了很多问题之后,代码终于在 QEMU 上正常运行了:https ://github.com/iNvEr7/qemu-learn/tree/master/semihosting-newlib
(注意:QEMU 5.2.0 似乎有一个错误会导致 newlib 对 HEAPINFO 的半主机调用崩溃,因此要在 QEMU 上运行我的代码,您必须编译 QEMU 主服务器,并使用make run
target 在 tmux 会话中使用 QEMU 运行代码)
但是,我想为我在与 newlib 集成时遇到的一些问题找到一些答案。
据我了解,newlib 作为一个 libc 实现,提供了一个 crt0 例程来初始化应用程序的内存区域,包括 .bss、.data、堆和堆栈。
但是,根据我的测试,GCC 链接的 crt0 不会初始化 .bss 和 .data 区域,因此会导致后面的 crt0 例程崩溃。
所以我必须为 .bss 和 .data 编写自己的初始化代码,以使其正确运行。
所以我想了解我是否以正确的方式做事?我是否遗漏了一些可以让 newlib 为我初始化这些区域的东西?还是自己进行初始化是常规的?
注意:我正在使用 arm-none-eabi-gcc stable 9-2019-q4-major